1. 什么是大小端
-
1.1 内存的存储地址
在了解大小端之前,首先得了解低地址与高地址。
|
低地址 |
高地址 | |
|
概念 |
地址数值较小的内存单元 |
地址数值较大的内存单元 |
|
存放 |
较起始位置 |
较末端位置 |
地址增长方向:低地址-->高地址。
例如:从0x00000000到0x00000FFF(此处地址显示为16进制)。其中,0x00000000是低地址,0x00000FFF是高地址。
-
1.2 字节序
-
高位字节:数据的最高有效位对应的字节。(如0x12345678,0x12是高位字节)
-
低位字节:数据的最低有效位对应的字节。(如0x12345678,0x78是低位字节)
-
-
1.3 大小端定义
-
大端(大端存储):高位字节存于低地址,低位字节存于高地址。
-
小端(小端存储):低位字节存于低地址,高位字节存于高地址。
-
|
地址 |
大端存储 |
小端存储 |
|
0x11 22 33 44 |
11 22 33 44 |
44 33 22 11 |
-
1.4 大小端起源
术语源于《格列佛游记》:小人国的鸡蛋打破方式分为 “从小端敲”和 “从大端敲”。
-
1.5 了解大小端的意义
当数据在不同大小端的系统之间传输或直接操作内存字节时,若不处理大小端差异,会导致数据解析错误。
2. 大小端的检测
方法:若定义一个变量为1,其十六进制:0x 00 00 00 01
其大端存储:00 00 00 01
其小端存储:01 00 00 00
利用char*强制类型转换,取其前两个数,看是否为1。
#include <stdio.h>
int main() {
int a = 1;
if (1 == *(char*)&a) {
printf("小端\n");
}
else {
printf("大端\n");
}
return 0;
}
3. 大小端的转换
利用指针历遍字节:通过指针逐个访问字节,反向存储实现转换。
//转换n字节数据(n是2的幂)
void swap_bytes(void *data, int n) {
uint8_t *bytes = (uint8_t *)data; //按字节访问
for (int i = 0; i < n / 2; i++) {
//交换第i个和第n-1-i个字节
uint8_t temp = bytes[i];
bytes[i] = bytes[n - 1 - i];
bytes[n - 1 - i] = temp;
}
}
1024

被折叠的 条评论
为什么被折叠?



