有些计算机先从低位字节开始存放,有些则先从高位字节开始存放,它们分别称为“小端(little-endian)”和“大端(big-endian)”
该问题不仅关系到通信系统,还关系到可移植性。如果一台计算机可以写数据,而另一台计算机需要读这些数据,我们就得先知道第二台主机如何理解第一台写的数据。注意,只有在按字节寻址的时候才需要考虑尾端问题,字节内部的位序与尾端没有关系。
为了解决通信的问题,TCP/IP协议规定使用“大端”字节序为网络字节序,这样一来,使用小端的计算机在发送数据的时候必须要将自己的多字节数据由主机字节序转换为网络字节序(即“大端”字节序),而在接收数据时,要转换为自己的主机字节序再进行后续处理。这样网络通信就与CPU、操作系统无关了,实现了网络通信的标准化
big endian: 0x11223344 -> |0x11|0x22|0x33|0x44|
little endian: 0x11223344 -> |0x44|0x33|0x22|0x11|
大端:高字节放在低地址。和我们从左到右阅读的习惯一致。
小端:低字节放在低地址。
下面的c程序可以用来判断大小端
#include <stdio.h>int main()
{unsigned int x = 0x12345678;if (*(char *)&x == 0x78){printf("little-endian.\n");}else if (*(char *)&x == 0x12){printf("big-endian\n");}else{printf("confused.\n");}return 0;
}
用lscpu命令也可以获得大小端信息。
本文链接:https://my.lmcjl.com/post/10307.html
展开阅读全文
4 评论