1、手动转换大小端
使用 按位运算 (>>
<<
|
&
) 交换字节的顺序。
1)16 位数(uint16_t)转换
#include <stdio.h>
#include <stdint.h>
uint16_t swap16(uint16_t num) {
return (num >> 8) | (num << 8);
}
int main() {
uint16_t num = 0x1234; // 大端: 0x1234 -> 小端: 0x3412
uint16_t swapped = swap16(num);
printf("Original: 0x%X\nSwapped: 0x%X\n", num, swapped);
return 0;
}
2) 32 位数(uint32_t)转换
#include <stdio.h>
#include <stdint.h>
uint32_t swap32(uint32_t num) {
return ((num >> 24) & 0x000000FF) | // 取最高 8 位,移动到最低
((num >> 8) & 0x0000FF00) | // 取次高 8 位,移动到次低
((num << 8) & 0x00FF0000) | // 取次低 8 位,移动到次高
((num << 24) & 0xFF000000); // 取最低 8 位,移动到最高
}
int main() {
uint32_t num = 0x12345678; // 大端: 0x12345678 -> 小端: 0x78563412
uint32_t swapped = swap32(num);
printf("Original: 0x%X\nSwapped: 0x%X\n", num, swapped);
return 0;
}
3)64 位数(uint64_t)转换
#include <stdio.h>
#include <stdint.h>
uint64_t swap64(uint64_t num) {
return ((num >> 56) & 0x00000000000000FF) |
((num >> 40) & 0x000000000000FF00) |
((num >> 24) & 0x0000000000FF0000) |
((num >> 8) & 0x00000000FF000000) |
((num << 8) & 0x000000FF00000000) |
((num << 24) & 0x0000FF0000000000) |
((num << 40) & 0x00FF000000000000) |
((num << 56) & 0xFF00000000000000);
}
int main() {
uint64_t num = 0x1234567890ABCDEF; // 大端: 0x1234567890ABCDEF -> 小端: 0xEFCDAB9078563412
uint64_t swapped = swap64(num);
printf("Original: 0x%lX\nSwapped: 0x%lX\n", num, swapped);
return 0;
}
2、检查当前系统是大端还是小端
可以使用 联合体(union) 或 指针类型转换 来检查。
#include <stdio.h>
int is_big_endian() {
int num = 1;
return *(char *)&num == 0; // 大端返回 1,小端返回 0
}
int main() {
if (is_big_endian()) {
printf("系统是大端模式\n");
} else {
printf("系统是小端模式\n");
}
return 0;
}
3、应用场景
1)网络传输
互联网标准采用 大端格式(Network Byte Order)。计算机通常使用 小端格式(Host Byte Order)。使用 htonl()
/ ntohl()
进行转换(但这里是手动实现)。
2)二进制文件解
处理不同架构生成的二进制文件,如图片、音频、视频格式等。
3)嵌入式系统
处理 MCU、ARM 设备时,不同厂商可能使用不同字节序。