大小端问题整理

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位整数从网络字节顺序转换为主机字节顺序。

参考:

你真的懂CPU大小端模式吗?_字节

Big Endian 和 Little Endian 详解_bigendian littleendian-CSDN博客

https://zhuanlan.zhihu.com/p/21388517

https://blog.csdn.net/alidada_blog/article/details/84578523

htonl()、htons()、ntohl()、ntohs()四个函数-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值