字节序

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。

字节序分为两种:

1. Little endian:将低序字节存储在起始地址

LE little-endian
最符合人的思维的字节序
地址低位存储值的低位
地址高位存储值的高位
怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说
低位值小,就应该放在内存地址小的地方,也即内存地址低位
反之,高位值就应该放在内存地址大的地方,也即内存地址高位 


2. Big endian   :将高序字节存储在起始地址

最直观的字节序
地址低位存储值的高位
地址高位存储值的低位
为什么说直观,不要考虑对应关系
只需要把内存地址从左到右按照由低到高的顺序写出
把值按照通常的高位到低位的顺序写出
两者对照,一个字节一个字节的填充进去


例子:在内存中双字0x01020304(DWORD)的存储方式

             内存地址
                           4000&4001&4002&4003
                     LE 04  03  02  01
                     BE 01  02  03  04
 例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
                         big-endian    little-endian
                      0x0000 0x12   0xcd
                      0x0001 0x34   0xab
                      0x0002 0xab   0x34
                      0x0003 0xcd   0x12
            x86系列CPU都是little-endian的字节序.


网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian(大端序)排序方式。


1.BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型的数据有关的比如int,short,long型,而对单字节数据byte却没有影响。
                   比如 int a = 0x08070605
                   在BIG-ENDIAN的情况下存放为:
                   字节号 0 1 2 3
                   数据 08 07 06 05
                   在LITTLE-ENDIAN的情况下存放为:
                   字节号 0 1 2 3
                   数据 05 06 07 08
                   又比如数字0x87654321,在两种不同字节序CPU中,其存储顺序如下所示:
                   Little Endian
                   低地址 高地址
                    ----------------------------------------->
                   | 21 |43 | 65 | 87 |
                   Big Endian
                   低地址 高地址
                    ----------------------------------------->
                   | 87 |65 | 43 |21 |

                   采用LITTLE-ENDIAN方式存储数据,地位地址存放低位数据,可以用“低对低”来方便记忆与理解。
                   采用BIG-ENDIAN方式存储数据,从书写习惯上看,高位数据排列在前面(低址在前面),可以用“高位在前”来简化理解。


2.BIG-ENDIAN、LITTLE-ENDIAN、跟CPU有关的,每一种CPU不是BIG-ENDIAN就是LITTLE-ENDIAN、。IA架构(Intel、AMD)的CPU中是Little-
Endian,而PowerPC 、SPARC和Motorola处理器是Big-Endian。这其实就是所谓的主机字节序。而网络字节序是指数据在网络上传输时是大
头还是小头的,在Internet的网络字节序是BIG-ENDIAN。所谓的JAVA字节序指的是在JAVA虚拟机中多字节类型数据的存放顺序,JAVA字节序
也是BIG-ENDIAN。


3.所以在用C/C++写通信程序时,在发送数据前务必用htonl和htons去把整型和短整型的数据进行从主机字节序到网络字节序的转换,而接
收数据后对于整型和短整型数据则必须调用ntohl和ntohs实现从网络字节序到主机字节序的转换,在Visual C++中,这四个函数被包含在头
文件Winsock2.h里面,链接时需要链入Ws2_32.lib[1] 。如果通信的一方是JAVA程序、一方是C/C++程序时,则需要在C/C++一侧使用以上几
个方法进行字节序的转换,而JAVA一侧,则不需要做任何处理,因为JAVA字节序与网络字节序都是BIG-ENDIAN,只要C/C++一侧能正确进行
转换即可(发送前从主机序到网络序,接收时反变换)。如果通信的双方都是JAVA,则根本不用考虑字节序的问题了。


4.如果网络上全部是相同字节序的计算机那么不会出现任何问题,但由于实际有大量不同字节序的计算机,所以如果不对数据进行转换,
就会出现大量的错误。



说明:以上内容来自百度百科

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值