Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1155615
  • 博文数量: 115
  • 博客积分: 950
  • 博客等级: 准尉
  • 技术积分: 1734
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-08 20:46
文章分类

全部博文(115)

文章存档

2015年(5)

2014年(28)

2013年(42)

2012年(40)

分类: LINUX

2012-09-27 15:05:09

关于大小字节序,之前反复使用各种方式记,过段时间又忘。遇到的时候经常又要查。

今天突然想到一个比较合理的办法,可以解决这个问题:

以内存中低地址为中心:

 1. 如果存放的是数据的低字节,就是小字节序

 2. 如果存放的是数据的高字节,就是大字节序


附上一个测试自己机子大小字节序的程序:


#include
#include

int
main(void)
{
        union{
                short st;
                char ch;
        }un;

        un.st = 0x12;

        if(un.ch == 0x12)
        {
                printf("This is little endian!\n");
        }
        else
        {
                printf("This is big endian!\n");
        }
}

Oh, my god. 保佑我以后不会再forget。

在此标记!


-------------------------------------------------分割线------------------------------------------

以上是众所周知的一个知识点,而且要注意到一点,以上分析都是以字节为单位进行的。
一直有个疑问: 在一个字节中,比特位的存放顺序是否也有大小端之分??

但是之前有一次看网络的相关代码时候,网络中的代码一直都会某个type或者len占用的并不是以字节为单
位的,有时候type会用到仅仅两个bit位。如此一来在编程中就会有一个宏定义来分割是大端还小端的环境。

因此同一个字节里面也是有大小端之分的!!!!

今天在看代码时候又看到相应的证据,贴出供参考下
环境是IPv6中对相应的IPv6的ip根据plen进行mask(以下代码是在大端字节序的环境下使用的)

点击(此处)折叠或打开

  1. int
  2. prefix6_mask(in6, plen)
  3. struct in6_addr *in6;
  4. int plen;
  5. {
  6. struct sockaddr_in6 mask6;
  7. int i;

  8. if (sa6_plen2mask(&mask6, plen))
  9. return (-1);

  10. for (i = 0; i < 16; i++)
  11. in6->s6_addr[i] &= mask6.sin6_addr.s6_addr[i];

  12. return (0);
  13. }

  14. int
  15. sa6_plen2mask(sa6, plen)
  16. struct sockaddr_in6 *sa6;
  17. int plen;
  18. {
  19. u_char *cp;

  20. if (plen < 0 || plen > 128)
  21. return (-1);

  22. memset(sa6, 0, sizeof(*sa6));
  23. sa6->sin6_family = AF_INET6;
  24. #ifdef HAVE_SA_LEN
  25. sa6->sin6_len = sizeof(*sa6);
  26. #endif

  27. for (cp = (u_char *)&sa6->sin6_addr; plen > 7; plen -= 8)
  28. *cp++ = 0xff;
  29. *cp = 0xff << (8 - plen);

  30. return (0);
  31. }

阅读(1973) | 评论(0) | 转发(0) |
0

上一篇:strstr之查看libc的版本号

下一篇:wide-dhcp

给主人留下些什么吧!~~