标签:字节序-位序
字节序(byte order)和位序(bit order)
?在网络编程中经常会提到网络字节序和主机序,也就是说当一个对象由多个字节组成的时候需要注意对象的多个字节在内存中的顺序。
?以前我也基本只了解过字节序,但是有一天当我看到ip.h中对IP头部结构体struct iphdr的定义时,我发现其中竟然对一个字节中的8个比特位也区分了大小端,这时我就迷糊了,不是说大小端只有在多个字节之间才会有区分的吗,为什么这里的定义却对一个字节中的比特位也区分大小端呢?
?下面我们先看一下struct iphdr的定义,后文会解惑为什么要在一个字节中区分大小端。
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 <asm/byteorder.h>"
#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>
struct bit_order{
unsigned char a: 2,
b: 3,
c: 3;
};
int main(int argc, char *argv[])
{
unsigned char ch = 0x79;
struct bit_order *ptr = (struct bit_order *)&ch;
printf("bit_order->a : %u\n", ptr->a);
printf("bit_order->b : %u\n", ptr->b);
printf("bit_order->c : %u\n", ptr->c);
return 0;
}
?我们把代码在gentoo(intel小端机器)、hu-unix(大端机器)两个机器上面编译、运行,结果如下:
liuxingen@ V6-Dev ~/station $ ./bitfiled
bit_order->a : 1
bit_order->b : 6
bit_order->c : 3
下面是hp-unix的运行结果
# ./bitfiled
bit_order->a : 1
bit_order->b : 7
bit_order->c : 1
?我们先分析一下gentoo上面的结果:
????????????图6:小端机器的位域示例
?从上图中我们很容易就能理解gentoo上面的输出结果,下面是hp-unix上面示意图:
????????????图7:大端机器的位域示例
?从上面的输出可以看到同样的代码在不同的机器中输出了不同的结果,也就是说我们的代码在不同的平台不能直接移植,导致这个问题的原因就是我们前面提到的关于位域的一个约定,定义在前面的位域总是出现在低地址的bit位中,因为不同的平台的比特序是不同的,但是我们定义的位域没有根据平台的大小端进行转换,最后就导致了问题。那么如何解决这个问题,那就是在定义结构体中的位域时判断平台的大小端:
#include<stdio.h>
#include<asm/byteorder.h>
struct bit_order{
#if defined(__LITTLE_ENDIAN_BITFIELD)
unsigned char a: 2,
b: 3,
c: 3;
#elif defined (__BIG_ENDIAN_BITFIELD)
unsigned char c: 3,
b: 3,
a: 2;
#else
#error "Please fix <asm/byteorder.h>"
#endif
};
int main(int argc, char *argv[])
{
unsigned char ch = 0x79;
struct bit_order *ptr = (struct bit_order *)&ch;
printf("bit_order->a : %u\n", ptr->a);
printf("bit_order->b : %u\n", ptr->b);
printf("bit_order->c : %u\n", ptr->c);
return 0;
}
?到此我们也就解释了文章开头关于struct iphdr定义中的那个疑问。
?最后给大家隆重介绍一篇文章,对我启发很大,文中的很多知识来自于它:byte order and bit order
标签:字节序-位序
原文地址:http://blog.csdn.net/liuxingen/article/details/45420455