1.什么是大端和小端
大端模式(Big-Endian):是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。
小端模式(Little-Endia):是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
例子:
如果32bit的数据0x12345678,从内存地址0x08004000开始存放:
地址 | 小端存放内容 | 大端存放内容 |
0x08004003 | 0x12 | 0x78 |
0x08004002 | 0x34 | 0x56 |
0x08004001 | 0x56 | 0x34 |
0x08004000 | 0x78 | 0x12 |
注:数据0x12345678的左边我们认为是高字节位,右边位低字节位。每个地址存1个字节,2位16进制数是1个字节(0xFF=11111111)。从上面表格可以看得出来,大小端的差异在于存放顺序不同。
2.那么我们如何去判断一个机器是大端还是小端
- 指针法
- 共同体的方法
- Linux中的大小端
具体方法可以参考:【操作系统】大小端问题_什么情况判断不出来大端小端-CSDN博客
3.常见CPU的大小端存储方式
目前我们常见的CPU PowerPC、IBM是大端模式,x86是小端模式。ARM既可以工作在大端模式,也可以工作在小端模式,一般ARM都默认是小端模式。一般网络字节序都采用的是大端模式。另外,常见文件的字节序如下:
BMP – Little Endian
GIF – Little Endian
JPEG – Big Endian
RTF – Little Endian
Adobe PS – Big Endian
DXF(AutoCAD) – Variable
注:CPU需根据具体型号查询手册,有的CPU甚至可能同时能支持两种存储方式。上文说的网络字节顺序则是表示网络传输时的字节序,按照TCP/IP协议是按照大端传输方式,也就是高字节先走(先传12,接着34,56,78),这跟本机存储和服务器存储没有关系,只要确保双方解析对应即可。
4、C语言中关于网络字节序与主机字节序转换的函数
htons 是把你机器上的整数转换成“网络字节序”, 网络字节序是 big-endian,也就是整数的高位字节存放在内存的低地址处。 而我们常用的 x86 CPU (intel, AMD) 电脑是 little-endian,也就是整数的低位字节放在内存的低字节处。举个例子吧。假定你的port是0x1234,在网络字节序里 这个port放到内存中就应该显示成addr addr+1,也就是:0x12 0x34;而在x86电脑上,0x1234放到内存中实际是:addr addr+1,也就是:0x34 0x12。htons 的用处就是把实际内存中的整数存放方式调整成“网络字节序”的方式。
在计算机网络编程中常用于进行主机字节顺序(Host Byte Order)和网络字节顺序(Network Byte Order)之间的转换的函数如下:
-
htonl()
(Host to Network Long)函数用于将一个32位整数从主机字节顺序转换为网络字节顺序。 -
htons()
(Host to Network Short)函数用于将一个16位整数从主机字节顺序转换为网络字节顺序。 -
ntohl()
(Network to Host Long)函数用于将一个32位整数从网络字节顺序转换为主机字节顺序。 -
ntohs()
(Network to Host Short)函数用于将一个16位整数从网络字节顺序转换为主机字节顺序。
参考:
Big Endian 和 Little Endian 详解_bigendian littleendian-CSDN博客
https://zhuanlan.zhihu.com/p/21388517
https://blog.csdn.net/alidada_blog/article/details/84578523