Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48483
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-20 13:19
文章分类

全部博文(10)

文章存档

2016年(2)

2015年(8)

我的朋友

分类: C/C++

2015-04-20 23:15:17

字节序的解释一般是:
1. 小端:将低位字节存储在低地址
2. 大端:将高位字节存储在低地址
所以,一直以来也只注意到了不同字节序的机器上字节的排序问题。虽然Linux的网络代码用到位域的地方都区分了大小端,但也一直没有留意。
最近,在写一个从内核发包的模块时,突然想起这个问题,其实对于存储在同一个字节的不同变量,不同字节序的CPU处理的顺序也是不同的。所以,在小端系统上,同一字节的不同位域才要跟协议相反。比如下面代码的宏:
    

点击(此处)折叠或打开

  1. struct iphdr {
  2. #if defined(__LITTLE_ENDIAN_BITFIELD)
  3.     __u8    ihl:4,
  4.         version:4;
  5. #elif defined (__BIG_ENDIAN_BITFIELD)
  6.     __u8    version:4,
  7.           ihl:4;
  8. #else
  9. #error    "Please fix "
  10. #endif
  11.     __u8    tos;
  12.     __be16    tot_len;
  13.     __be16    id;
  14.     __be16    frag_off;
  15.     __u8    ttl;
  16.     __u8    protocol;
  17.     __sum16    check;
  18.     __be32    saddr;
  19.     __be32    daddr;
  20.     /*The options start here. */
  21. };



以下是测试程序:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main()
  4. {
  5.     unsigned int i;
  6.     struct Node
  7.     {
  8.         char a:4;
  9.         char b:4;
  10.     }node;
  11.     char *p;

  12.     memset(&node, 0, sizeof(struct Node));

  13.     node.b = 0xF;
  14.     
  15.     p = (char *)&node;
  16.     for (i = 0; i < sizeof(struct Node); i++)
  17.     {
  18.         printf("%02x\n", (unsigned char)*p);
  19.         p++;
  20.     }

  21.     return 0;
  22. }

        小端机器上输出0f,大端机器上输出f0

可见,大端系统上,存储位域变量时,优先存储在字节的高权重位;而小端系统则优先存在的字节的低权重位。
所以对于字节序的定义,还要加一句:
对于位域:
1.小端:位域优先存储在字节的低权重位。
2.大端:位域优先存储在字节的高权重位。
阅读(1975) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~