字节序转换详解
在网络传输和跨平台任务中,涉及网络字节序和主机字节序的转换,即数据大端和小端的转换。
概念
字节序
数据在内存中的存放顺序
- 小端(Little-endian):低位字节存放在内存的低地址端,高位字节存放在内存的高地址端
- 大端(Big-endian): 高位字节存放在内存的低地址端,低位字节存放在内存的高地址端
int16_t vlaue = 2;
Little-endian: 0000 0000 0000 0010. // 十进制 2
Big-endian: 0000 0010 0000 0000 // 十进制 512
同一数据在不同字节序下的值是不一样的,因此需要进行字节序的转换,保证数据不出错。
解决方案
字节序转换函数
uint16_t htons(uint16_t hostshort); // 主机字节序->网络字节序
uint16_t ntohs(uint16_t netshort); // 网络字节序->主机字节序
uint32_t htons(uint32_t hostlong); // 主机字节序->网络字节序
uint32_t ntohs(uint32_t netlong); // 网络字节序->主机字节序
<arpa/inet.h>
头文件仅提供了16位和32位数据的字节序转换函数,分别用于端口和网络地址的字节序转换,但在某些场景下,可能需要64位数据的字节序转换函数。
`<byteswap.h>头文件提供了16-64位数据的字节序转换函数,可利用这些函数封装自己的字节序转换函数
#include <byteswap.h>
bswap_16(x);
bswap_32(x);
bswap_64(x);