字节序学习
转自:https://cloud.tencent.com/developer/article/1176183
1.介绍
字节序,指字节在内存中存储的顺序。 如一个int32_t类型的数值占用4个字节,这4个字节在内存中的排列顺序就是字节序。字节序有两种:
1)小端字节序(Little endinan),数值低位存储在内存的低地址,高位存储在内存的高地址;
2)大端字节序(Big endian),数值高位存储在内存的低地址,低位存储在内存的高地址。
以16进制数0x12345678为例(数值左边是高位,右边是低位),大端和小端:
- 主机字节序,即CPU存储数据时采用的字节顺序。分为两大派系,PowerPC系列采用big endian方式存储数据,而x86与x86_64系列则采用little endian方式存储数据。平常大多数PC与服务器如果使用的是Intel与AMD CPU,一般都是little endian。
// //@ret:返回0小端字节序,返回1大端字节序 // int dGetHostByteOrder() { uint32_t a = 0x12345678; uint8_t *p = (uint8_t *)(&a); if(*p==0x78) { return 0; } else { return 1; } }
- 网络字节序,是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。
socket网络编程中,有4个标准库函数做转换:
#include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); //把uint32_t类型从主机序转换到网络序 uint16_t htons(uint16_t hostshort); //把uint16_t类型从主机序转换到网络序 uint32_t ntohl(uint32_t netlong); //把uint32_t类型从网络序转换到主机序 uint16_t ntohs(uint16_t netshort); //把uint16_t类型从网络序转换到主机序
//但如果是64位的,需要写函数,好复杂,看不懂。3种方式:移位、联合体union、编译器内置函数。