为什么会有字节序大小端之分呢?因为不同厂商处理器处理数据存放时采取的策略不同。
一个字节8位比特,对于16位或者32位这种位数大于8位的处理器,由于寄存器宽度大于一个字节,必然存在多个字节存放顺序的问题。
小端字节序(LE little-endian):数据低位存储在内存低地址
大端字节序(BE big-endian):数据高位存储在内存低地址
例如,数值 0x12345678(16进制表示的32位整型)
想象内存地址从左向右由低到高,则
小端字节序: 0x78563412
大端字节序: 0x12345678
网络字节序是大端字节序。可以想象,随着传输数据不断增加,内存地址由低到高不断增加,传输过程中数据高位先到达,数据低位后到达,即数据高位存储在内存低地址,最新进行处理。
经常存在的一个误区是,与网络字节序是大端相对应,主机字节序就是小端字节序。其实不然,不同处理器及操作系统类型决定了主机字节序是大端还是小端,不是所有主机字节序都是小端。可以通过运行以下代码获取当前主机是小端还是大端。
那么什么时候需要在大小端字节序之间做转换呢?
TCP/IP 协议栈规定采用大端字节序,即地址(IP/PORT)用网络字节序,故主机字节序如果为小端,需要将通信参数(ip、port等)转换为大端字节序(htonl 或 htons)
自己的应用程序传输的数据,如果通信双方主机字节序一致,可不进行转换,如果不一致,则需要按统一字节序做相应的转换。
字节序与ip整型转换又有什么关系呢?
一个点分十进制ip地址:10.1.30.28
可看做32位整型: 00001010 00000001 00011110 00011100
转换为 10 进制:167845404
转换二进制为网络字节序:00011100 00011110 00000001 00001010
转换为网络字节序后的 10 进制:471728394
调用 inet_addr 函数之后的结果:0x1c1e010a 等于 10进制 471728394
inet_addr 函数的作用是,将点分十进制 IP 地址转换成 网络字节序 IP 地址,即 471728394。
网上很多页面工具提供ip整型转换,通常都是转成 167845404,这一点需要能够清楚区分,尤其在ip限制、地域区分等场景中,字节序弄反会造成困扰。
本文暂时没有评论,来添加一个吧(●'◡'●)