字节序分为小端(主机字节序)和大端(网络字节序):
1、所谓字节序是:
数据在存储中,是由高字节部分到低字节部分,还是由低字节部分到高字节部分,就是字节序;
小端:从低字节部分到高字节部分存储
大端:从高字节部分到低字节部分存储
如0x1234:
内存顺序: 低---高
在小端的存储顺序是:34 12
在大端的存储顺序是:12 34---------------存储顺序和书写顺一致,高位在前存,低位在后存
2、网络字节序是大端,主机字节序是小端:
网络传输字节顺序是大端方式,即先传输的会是高字节部分;
主机字节序是小端,即低位部分字节先被存储,高位部分字节最后被存储
主机字节序是小端可能的原因:当做类型转换时比较方便,如:
short int i = 0x1234;
int j = (int)i;
变量j的存储情况是:
内存顺序:低------------高
34 12 00 00
简单的在后边补0即可;
3、Linux api:
头文件:#include <endian.h>,/usr/include/endian.h,实际实现在/usr/include/bits/byteswap.h,定义了所有转换的宏函数:
(无符号)64字节主机转网络:htobe64(uint64_t data)
(无符号)64字节网络转主机:be64toh(uint64_t data)
(无符号)32字节主机转网络:htobe32(uint32_t data)
(无符号)32字节网络转主机:be32toh(uint32_t data)
(无符号)16字节主机转网络:htobe16(uint16_t data)
(无符号)16字节网络转主机:be16toh(uint16_t data)