# 字节序
即计算机在存储或读取数据时,字节的顺序。计算机是从低字节依次向高字节进行 读。 数据
12345678
- 大端:
低
字节在高位(即后面)
,高
字节在前面
(符合人类的习惯)
- 小端:
低
字节在低位(即前面)
计算机
一般都是小端序
网络
序时大端序
#include <stdio.h> | |
union | |
{ | |
short a; | |
char b[2]; | |
} un; | |
int main(void) | |
{ | |
un.a = 0x1234; //0x 十六进制,0 八进制 | |
if (un.b[0] == 0x34) // 低字节存放在低位,小端 | |
{ | |
printf("小端序"); | |
} | |
else if(un.b[0] == 0x12) // 高字节存在低位,低字节存在高位, | |
{ | |
printf("大端序"); | |
} | |
return 0; | |
} |
# 常见的处理器架构
架构 | 模式 | 描述 |
---|---|---|
x86/x64 | 小端 模式 | |
ARM | 大小端模式 可配置 | 1 为 大 端, 0 为 小 端, 复位时 确认,不能更改 |
# 为什么要区分大小端
芯片存储空间以字节为
单位存储
,每个字节都有高低地址之分,只有超过了一个字节的数据,就需要区分呢大端还是小端。
大小端的优缺点来说。存储效率,在 CPU 计算时内核效率。
# 大端小端优缺点对比
# 数据传输
- 网络传输使用大端字节序可以
避免字节序
转换带来的性能损失
。传输中,若需要进行字节序转换
,会增加CPU的工作负载
,降低
系统性能
。网络数据包都是先传输头部信息
,然后再传输数据
,采用大端字节序
可以使头部信息
的数据大小和起始位置固定
,方便处理。
# 数据存储
- 容易
判断
多字节数据的大小
- 提高
内存利用率
小端存储地地址 总是存放着
数据最低
的有效字节,而高地址
存放着数据的最高有效字节
,这些特征使得小端序列
的地址按值递增
时,多字节数据的存储顺序和阅读顺序都是按顺序排列的,可以充分利用内
存的特征。大端序列却不好 利用内存。如下:
小端字节序
,低位字节总是存储在最低的地,对于多字节整数的部分访问
和计算
更加方便
# Linux 对字节序转换
将
长整型
转换为网络大端字节序
,使用htonl
,短整型使用htons
将
网络字节序
转换为本地小端字节序
,使用ntohl
,短整型使用ntohs()
The htonl() function converts the unsigned integer hostlong from host byte order to network byte order. | |
The htons() function converts the unsigned short integer hostshort from host byte order to network byte order. | |
The ntohl() function converts the unsigned integer netlong from network byte order to host byte order. | |
The ntohs() function converts the unsigned short integer netshort from network byte order to host byte order. |