- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
字节序 (byte order) 和位序 (bit order)
字节序 (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
#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. */
};
字节序 (Byte order)
关于字节序的文章已经有很多了,在我这篇文章中不打算过
多的说字节序,但是也不能完全脱离字节序因为后面的重点
部分比特序跟字节序也有一定的相似度和联系。
字节序就是说一个对象的多个字节在内存中如何排序存放,
比如我们要想往一个地址 a 中写入一个整形数据
0,那么最后在内存中是如何存放这四个字节的
呢?
0x12 这个字节值为最高有效字节,也就是整数值的最高位
(在本文中 0x12=0 ,0x78 为最低有效字节。
图 1:大端字节序
上图是大端字节序的示意图,所谓”大端字节序” ,便是指
最高有效字节落在低地址上的字节存放方式。
图 2 :小端字节序
而小端字节序就是最低有效字节落在低地址上的字节存放
方式。
00+ 0x340000 + 0x5600 + 0x78 ,所以
要想保持一个对象的值在大小端系统之间不变,那么就必须
确保不同的系统能够正确的识别最高有效字节和最低有效
字节 (不能错误的识别最高、最低有效字节 )。
同样的字节序 12 34 56 78 在大端序机器中会识别为
00+ 0x340000 + 0x5600 +
0x78=0 ,在小端序机器中识别为 00x12
+ 0x3400 + 0x5600 00+ 00 。
所以要想两者保持一致就必须确保系统能够正确的识别最
高有效字节 0x12 和最低有效字节 0x78 ,那么在小端系统中
字节存放的顺序应该为
原创力文档


文档评论(0)