字节序的解释一般是:
1. 小端:将低位字节存储在低地址
2. 大端:将高位字节存储在低地址
所以,一直以来也只注意到了不同字节序的机器上字节的排序问题。虽然Linux的网络代码用到位域的地方都区分了大小端,但也一直没有留意。
最近,在写一个从内核发包的模块时,突然想起这个问题,其实对于存储在同一个字节的不同变量,不同字节序的CPU处理的顺序也是不同的。所以,在小端系统上,同一字节的不同位域才要跟协议相反。比如下面代码的宏:
-
struct iphdr {
-
#if defined(__LITTLE_ENDIAN_BITFIELD)
-
__u8 ihl:4,
-
version:4;
-
#elif defined (__BIG_ENDIAN_BITFIELD)
-
__u8 version:4,
-
ihl:4;
-
#else
-
#error "Please fix "
-
#endif
-
__u8 tos;
-
__be16 tot_len;
-
__be16 id;
-
__be16 frag_off;
-
__u8 ttl;
-
__u8 protocol;
-
__sum16 check;
-
__be32 saddr;
-
__be32 daddr;
-
/*The options start here. */
-
};
以下是测试程序:
-
#include <stdio.h>
-
#include <string.h>
-
-
int main()
-
{
-
unsigned int i;
-
struct Node
-
{
-
char a:4;
-
char b:4;
-
}node;
-
char *p;
-
-
memset(&node, 0, sizeof(struct Node));
-
-
node.b = 0xF;
-
-
p = (char *)&node;
-
for (i = 0; i < sizeof(struct Node); i++)
-
{
-
printf("%02x\n", (unsigned char)*p);
-
p++;
-
}
-
-
return 0;
-
}
小端机器上输出0f,大端机器上输出f0
可见,大端系统上,存储位域变量时,优先存储在字节的高权重位;而小端系统则优先存在的字节的低权重位。
所以对于字节序的定义,还要加一句:
对于位域:
1.小端:位域优先存储在字节的低权重位。
2.大端:位域优先存储在字节的高权重位。
阅读(1975) | 评论(0) | 转发(0) |