网络字节顺序 大小端讨论

来源:互联网 发布:暗黑战神 源码泄露 编辑:程序博客网 时间:2024/05/22 06:21

关于什么是大端,什么是小端,网上写的很清楚。

不过我这里还是要补充一种很通俗的说法:大端就是起始地址存放的是大端(高位字节的那一端),小端就是起始地址存放的是小端(低位字节的那一端)

同时要注意,大小端只是字节顺序,与每个字节的位是没关系的。比如0x0101,存放的位为:0000 0001 0000 0001,大小端并不是将其变为:1000 0000 1000 0000.而是一个字节为最小单位进行存储。

所以重点来了:网络socket编程时,IP地址、端口号等数据通常在编程时需要hton等函数来将本地字节序改为网络字节序,但是send、recv函数等发送接收数据却不需要。这句话不能全然对。现在我解释一下:

1. 网络socket编程时,ip层等底层是大端传输,所以假如你的本机是小端,设置了ip地址192.168.0.1,这个是32位数据的一种点分显示方法,其实32位数据为:0xC0A800001.传输时是以字节为单位进行发送和接收的,不论大小端,数组的索引号即代表了数组的地址大小,a[0]的地址肯定比a[1]低。

所以按照小端模式,则低地址存放低位数据,所以上述IP地址在数组中为ip[ ]={0x01,0x00,0xA8,0xC0}.ip[0]地址最低则存放0x01。

当把此数组传输出去,网络ip层会按照大端模式来理解(此处注意,不管什么模式,数组传输顺序不会变,都是先传低地址再传高地址),则会认为低地址存放高位字节,而将其转换为0x0100A8C0,点分显示为1.0.168.192.所以小端模式主机要进行转换。


2.记住,不管大小端,假如我要按照某种协议发送一些数据:例如顺序号0x123456的设备的4个属性值,每个属性值均为char类型,为0x11,0x22,0x33,0x44.则发送数据时不同之处在于:

    小端模式传输数组为:0x56,0x34,0x12,0x11,0x22,0x33,0x44

    大端模式传输数组为:0x12,0x34,0x56,0x11,0x22,0x33,0x44

    看出来了吧,大端、小端的意思可不是说把传输字节顺序全部颠倒哦!

  所以当小端的接收方收到小端的数据,则会同样按照小端的方式来解析数据,顺序号为0x123456.大端亦然。

   但若大端接收小端的数据,会解析为0x563412.


3.综上所述,ip地址端口号等是tcpip协议的一部分,所以满足小端发送大端接收,所以小端要将数据字节序颠倒然后发送。而send和recv数据为应用层数据,相对于tcpip协议而言不会进行解析,所以不需要转换。除非有上述第2描述的情况出现,这个由接收发送双方自己定义应用程序的协议即可。


艾玛,码字好辛苦。睡了

0 0
原创粉丝点击