字节序学习

发布时间 2024-01-01 16:47:40作者: lypbendlf

转自: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、编译器内置函数。