大型网站开发实例,软件外包开发保密协议,wordpress主题中文主题下载,作风建设问题在哪里一、Endian的起源 在各种计算机体系结构中#xff0c;对于字节、字等的存储机制有所不同#xff0c;因而引发了计算机通信领域中一个很重要的问题#xff0c;即通信双方交流的信息单元#xff08;比特、字节、字、双字等等#xff09;应该以什么样的顺序进行传送。如果不达…一、Endian的起源 在各种计算机体系结构中对于字节、字等的存储机制有所不同因而引发了计算机通信领域中一个很重要的问题即通信双方交流的信息单元比特、字节、字、双字等等应该以什么样的顺序进行传送。如果不达成一致的规则通信双方将无法进行正确的编/译码从而导致通信失败。
1980年Danny Cohen在其著名的论文”On Holy Wars and a Plea for Peace”中为了平息一场关于在消息中字节该以什么样的顺序进行传送的争论而引用了该词。该文中Cohen非常形象贴切地把支持从一个消息序列的最高位开始传送的那伙人叫做Big-Endians支持从最低位开始传送的相对应地叫做Little-Endians。此后Endian这个词便随着这篇论文而被广为采用。
二、字节序之Little-EndianBig-Endian 首先明确一点咱们接触到的物理单元最小都是字节因此无论是big endian还是little endian都是针对多个字节的序列而言的当然在通信领域中这里往往是bit不过原理也是类似的,稍后我会介绍。
对于字节序列的存储格式目前有两大阵营那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据而x86系列则采用little endian方式存储数据。那么究竟什么是big endian什么又是little endian呢
1Little-endian将低序字节存储在起始地址低位编址 2Big-endian将高序字节存储在起始地址高位编址
举个例子 如果我们将0x1234abcd写入到以0x0000开始的内存中则结果为
addressbig-endianlittle-endian0x00000x120xcd0x00010x340xab0x00020xab0x340x00030xcd0x12
注每个地址存1个字节2位16进制数是1个字节0xFF11111111
为什么要注意字节序的问题呢你可能这么问。当然如果你写的程序只在单机环境下面运行并且不和别人的程序打交道那么你完全可以忽略字节序的存在。
但是如果你的程序要跟别人的程序产生交互呢在这里我想说说两种语言。C/C语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的而JAVA编写的程序则唯一采用big endian方式来存储数据。
试想如果你用C/C语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果就拿上面的0x12345678来说你的程序传递给别人的一个数据将指向0x12345678的指针传给了JAVA程序由于JAVA采取big endian方式存储数据很自然的它会将你的数据翻译为0x78563412。什么竟然变成另外一个数字了是的就是这种后果。因此在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。
无独有偶所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。
目前应该little endian是主流因为在数据类型转换的时候尤其是指针转换不用考虑地址问题。
三、比特序之Little-EndianBig-Endian 可是有朋友仍然会问CPU存储一个字节的数据时其字节内的8个比特之间的顺序是否也有big endian和little endian之分或者说是否有比特序的不同
实际上这个比特序是同样存在的。下面以数字0xB410110100用图加以说明。
MSB的意思是全称为Most Significant Bit在二进制数中属于最高有效位MSB是最高加权位与十进制数字中最左边的一位类似。
LSB的意思是全称为Least Significant Bit在二进制数中意为最低有效位一般来说MSB位于二进制数的最左侧LSB位于二进制数的最右侧。
Big Endian msb------------------------lsb ±±±±±±±±±±±±±±±±±±±± | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | ±±±±±±±±±±±±±±±±±±±± 1 2 3 4 Little Endian lsb--------------------------msb ±±±±±±±±±±±±±±±±±±±± | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | ±±±±±±±±±±±±±±±±±±±± 1 2 3 4 实际上由于CPU存储数据操作的最小单位是一个字节其内部的比特序是什么样对我们的程序来说是一个黑盒子。也就是说你给我一个指向0xB4这个数的指针对于big endian方式的CPU来说它是从左往右依次读取这个数的8个比特而对于little endian方式的CPU来说则正好相反是从右往左依次读取这个数的8个比特。而我们的程序通过这个指针访问后得到的数就是0xB4字节内部的比特序对于程序来说是不可见的其实这点对于单机上的字节序来说也是一样的。
那可能有人又会问如果是网络传输呢会不会出问题是不是也要通过什么函数转换一下比特序嗯这个问题提得很好。假设little endian方式的CPU要传给big endian方式CPU一个字节的话其本身在传输之前会在本地就读出这个8比特的数然后再按照网络字节序的顺序来传输这8个比特这样的话到了接收端不会出现任何问题。而假如要传输一个32比特的数的话由于这个数在littel endian方存储时占了4个字节而网络传输是以字节为单位进行的little endian方的CPU读出第一个字节后发送实际上这个字节是原数的LSB到了接收方反倒成了MSB从而发生混乱。
扩展 https://blog.csdn.net/joenqc/article/details/71173382