byte and bit order dissection (网络和系统中的endianness)

byte and bit order dissection (网络和系统中的endianness)

ID:11274743

大小:148.00 KB

页数:11页

时间:2018-07-11

byte and bit order dissection (网络和系统中的endianness)_第1页
byte and bit order dissection (网络和系统中的endianness)_第2页
byte and bit order dissection (网络和系统中的endianness)_第3页
byte and bit order dissection (网络和系统中的endianness)_第4页
byte and bit order dissection (网络和系统中的endianness)_第5页
资源描述:

《byte and bit order dissection (网络和系统中的endianness)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、ByteandBitOrderDissection作者:KevinHe,2003-09-02原文地址:http://www.linuxjournal.com/article/6788译者:Love.Katherine,2007-04-14译文地址:http://blog.csdn.net/lovekatherine/archive/2007/04/14/1564731.aspx转载时务必以超链接形式标明文章原始出处及作者、译者信息。讨论大端与小端、比特序与节序的区别,以及它们的作用范围编辑提示:本文自最初发表后已做过修

2、改那些不得不和比特序、字节序问题打交道的软件或硬件工程师,都很清楚这过程就像是走迷宫。尽管通常我们都能走出迷宫,但是每次都要牺牲数量可观的脑细胞。本文试图概括需要处理比特序和字节序问题的领域,包括CPU、总线、硬件设备以及网络协议。我们将深入问题的细节,并希望能在这个问题上提供有价值的参考。本文同时还试图提供一些从实践中总结出的指导和拇指法则。大小端我们对"endianness"这个名词估计都很熟悉了。它首先被DannyCohen于1980引入,用来表述计算机系统表示多字节整数的方式。endianness分为两种:大端

3、和小端。(从字节序的角度来看)大端方式是将整数中最高位byte存放在最低地址中。而小端方式则相反,将整数中的最高位byte存放在最高地址中。对于某个确定的计算机系统,比特序通常与字节序保持一致。换言之,在大端系统中,每个byte中最高位bit存放在内存最低位;在小端系统中,最低位bit存放在内存最低位。在设计计算机系统时,应该尽一切可能避免通过软件方式执行bit换位,因为这样不仅会产生巨大开销,也是件令程序员感到乏味的工作。后文将介绍如何通过硬件方式处理这一问题。书写规则正如大部分人是按照从左至右的顺序书写数字,一个多

4、字节整数的内存布局也应该遵循同样的方式,即从左至右为数值的最高位至最低位。正如我们在下面的例子中所看到的,这是书写整数最清晰的方式。根据上述规则,我们按以下方式分别在大端和小端系统中值为0x0a0b0c0d的整数。在大端系统中书写整数:byteaddr0123bitoffset01234567012345670123456701234567binary00001010000010110000110000001101hex0a0b0c0d在小端系统中书写整数byteaddr3210bitoffset76543210765

5、432107654321076543210binary00001010000010110000110000001101hex0a0b0c0d以上两种情形,我们都是按从左至右的顺序读,整数值为0X0a0b0c0d假设我们不遵循上述的规则,也许我们会以如下方式书写整数:byteaddr0123bitoffset01234567012345670123456701234567binary10110000001100001101000001010000正如你所看到的,这种方式下想要看出我们要表达的整数是件困难的事情。本文中使用

6、的简化计算机系统在不失一般性的前提下,在本文中使用下图所描述的简化计算机系统:CPU、内部总线和内存/Cache这些部件由于通常拥有相同的endianness,可以作为一个整体用CPU来代表。而对于总线endianness讨论,只涉及外部总线。CPU寄存器宽度、内存字宽和总线宽度在本文中被设定为32bits。CPU的endiannessCPU的endianness是指它在寄存器、内部总线、Cahce和内存中表示多字节整数时所采取的字节序和比特序。小端的CPU包括Intel和DEC。大端CPU包括Motorola680x

7、0,SunSparcandIBM(如PowerPC)。MIPsandARM可以设定为任选其一。CPU的endianness影响着CPU的指令集。对于使用不同endianness的CPU,应该使用不同的GNU工具包来编译代码。例如,mips-linux-gcc和mipsel-linux-gcc分别用来编译生成运行于大端和小端模式的MIPS之上的代码。如果我们(程序员)需要访问多字节整数的一部分时,也必须考虑CPU的endianness。以下的程序展示了该种情形。注意,在访问32-bit整数的整体时,CPU的endiann

8、ess对于软件(程序员)是不可见的。union{uint32_tmy_int;uint8_tmy_bytes[4];}endian_tester;endian_testeret;et.my_int=0x0a0b0c0d;if(et.my_bytes[0]==0x0a)printf("I'monabig-endiansystem

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。