1. 字节序的日常化理解
第一次听到"大端字节序"和"小端字节序"这两个术语时,我正盯着一段十六进制内存数据发呆。那是我刚入行嵌入式开发时遇到的真实场景——同样的数据包,在不同设备上解析结果竟然不一样。后来才知道,这就是字节序差异导致的"血案"。
1.1 从现实生活看字节序
想象你在填写快递单的收货地址。中国人习惯先写省再写市(如"广东省深圳市"),这就像大端字节序——重要的高位信息放在前面。而西方人习惯先写门牌号再写街道名(如"205号硅谷大街"),这就像小端字节序——从最小单位开始排列。
计算机存储多字节数据(如int、float)时也存在这两种排列方式。以32位整数0x12345678为例:
- 大端模式存储为:12 34 56 78
- 小端模式存储为:78 56 34 12
1.2 为什么会有这种差异
早期各大厂商在设计处理器时做出了不同选择:
- 摩托罗拉68k、PowerPC等采用大端序(网络协议默认)
- x86、ARM等采用小端序(可切换模式)
关键区别:大端序更符合人类阅读习惯,小端序便于硬件处理连续进位
2. 技术原理深度解析
2.1 内存地址的本质
计算机内存就像一排储物柜,每个柜子(地址)固定存放1字节。当需要存储2字节的short类型时:
- 大端序:高位字节在低地址(柜子编号小的位置)
- 小端序:低位字节在低地址
用C语言验证:
c复制#include <stdio.h>
int main() {
int num = 0x12345678;
char *p = (char*)#
printf("字节顺序:");
for(int i=0; i<4; i++) {
printf("%02x ", p[i]);
}
}
在x86机器运行会输出:78 56 34 12(小端)
2.2 常见场景中的字节序
-
网络通信:TCP/IP协议规定使用大端序(网络字节序)
- 发送前需用htons()/htonl()转换
- 接收后用ntohs()/ntohl()还原
-
文件格式:
- JPEG文件头使用大端序
- Windows位图(BMP)使用小端序
