大端小端模式以及相互转化

文章目录

  • 概念
  • 转化方法
  • 应用

概念

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。(Big-Endian)
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址。(Little-Endian)

unsigned int value = 0x12345678为例
我们可以用unsigned char buf[4]来表示value
Big-Endian: 低地址存放高位,如下:
高地址
  ---------------
  buf[3] (0x78) -- 低位
  buf[2] (0x56)
  buf[1] (0x34)
  buf[0] (0x12) -- 高位
  ---------------
  低地址
Little-Endian: 低地址存放低位,如下:
高地址
  ---------------
  buf[3] (0x12) -- 高位
  buf[2] (0x34)
  buf[1] (0x56)
  buf[0] (0x78) -- 低位
  --------------
低地址

摘自百度百科

这里数据以16进制保存,内存地址1个字节=8位,0000 0000,4个0表示的范围为16,则一个字节保存的数字为2位16进制,即以0x12划分,而不是0x123
1个内存单元的长度是8bits,以8位二进制作为一个存储单元,也就是一个字节。
对于32位系统,一次读取的内存单元为4个字节的偶数倍

所以转换方法也可以自己写,对于每1个字节来操作即可

转化方法

#define ntohs(x)	__DARWIN_OSSwapInt16(x) //16位数据类型网络字节顺序到主机字节顺序的转换  
#define htons(x)	__DARWIN_OSSwapInt16(x) //16位数据类型主机字节顺序到网络字节顺序的转换

#define ntohl(x)	__DARWIN_OSSwapInt32(x) //32位数据类型网络字节顺序到主机字节顺序的转换 
#define htonl(x)	__DARWIN_OSSwapInt32(x) //32位数据类型主机字节顺序到网络字节顺序的转换 

记忆方法:ntohl 以中间的to隔开,则为n->hl 意为 net to host unsigned long ,32位数据类型网络字节顺序到主机字节顺序的转换。

应用

  • 互联网使用的网络字节顺序采用大端模式进行编址,而主机字节顺序根据处理器的不同而不同,如PowerPC处理器使用大端模式,而Pentuim处理器使用小端模式。
  • 在处理音视频数据时,网络传输以大端为主,而主机有可能是大端或者小端。
  • 例如收到数据为0x3456,由于网络传输以大端,如果机器此时使用小端存储,现要将该数据发出,如果不进行数据转换直接发送,此时发送的数据为0x56,0x34。会将该数据解释为0x5634而非原数据0x3456,此时就会发生灾难性的错误。所以,在此之前,需要将小端数据转换成大端的,即进行高字节和低字节的交换

你可能感兴趣的:(日常学习)