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 设备时,不同厂商可能使用不同字节序。