Endian
ENDIAN
在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。
定义
在各种体系的计算机中,通常采用big-endian和little-endian两种字节存储机制描述在多字节数中各个字节的存储顺序。
词源
格利佛游记》)。该小说在描述Gulliver畅游小人国时碰到了如下的一个场景。在小人国里的小人因为非常小(身高6英寸)所以总是碰到一些意想不到的问题。有一次因为对水煮蛋该从大的一端(Big-End)剥开还是小的一端(Little-End)剥开的争论而引发了一场战争,并形成了两支截然对立的队伍:支持从大的一端剥开的人Swift就称作Big-Endians,而支持从小的一端剥开的人就称作Little-Endians......(后缀ian表明的就是支持某种观点的人)。
字节该以什么样的顺序进行传送的争论而引用了该词。该文中,Cohen非常形象贴切地把支持从一个消息序列的最高位开始传送的那伙人叫做Big-Endians,支持从最低位开始传送的相对应地叫做Little-Endians。此后Endian这个词便随着这篇论文而被广为采用。
小端和大端格式
小端和大端格式(Little-Endian&Big-Endian)
不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序。
最常见的有两种:
1. Little-endian:将低序字节存储在起始地址(低位编址)
2. Big-endian:将高序字节存储在起始地址(高位编址)
LE(little-endian):
最符合人的思维的字节序:地址低位存储值的低位,地址高位存储值的高位。
怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说:低位值小,就应该放在内存地址小的地方,也即内存地址低位;反之,高位值就应该放在内存地址大的地方,也即内存地址高位
BE(big-endian):
最直观的字节序:地址低位存储值的高位,地址高位存储值的低位。
为什么说直观,不要考虑对应关系:只需要把内存地址从左到右按照由低到高的顺序写出,把值按照通常的高位到低位的顺序写出;两者对照,一个字节一个字节的填充进去
例子1:在内存中双字0x01020304(DWORD)的存储方式。
内存地址4000 4001 4002 4003
LE04030201
BE01020304
注:每个地址存1个字节,每个字有2个字节。2位16进制数是1个字节(0xFF=11111111)。
例子2:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
x86系列的CPU都是little-endian的字节序。
开发中的应用
在此示例中,调用 BitConverter 类的 GetBytes(Int32) 方法以将 int 转换为字节数组
参考资料
最新修订时间:2023-10-27 23:38
目录
概述
定义
词源
参考资料