#include <stdio.h> // 标准输入输出库,用于printf等函数
#include <stdint.h> // 标准整数类型库,提供uint8_t、uint16_t等类型
#include <string.h> // 字符串操作库(虽然当前代码未直接使用,但常用于内存操作)
// 检测本机是大端还是小端格式
int is_little_endian() {
uint16_t num = 0x0001; // 创建一个16位整数,值为0x0001
return *(uint8_t*)&num == 0x01; // 检查第一个字节是否为0x01(小端特征)
}
// 字节顺序转换函数
void change_byte_seq(void *p, size_t size, int flag) {
if (size <= 1) return; // 单字节无需转换(字节序只影响多字节数据)
uint8_t *bytes = (uint8_t*)p; // 将void指针转换为字节指针便于操作
size_t i, j; // 循环索引变量
// 反转字节顺序(对称交换)
for (i = 0; i < size / 2; i++) {
j = size - 1 - i; // 计算对称位置索引
uint8_t temp = bytes[i]; // 临时存储当前字节
bytes[i] = bytes[j]; // 交换字节位置
bytes[j] = temp; // 完成交换
}
}
// 测试函数
void test_conversion() {
uint32_t num = 0x12345678; // 定义一个测试用的32位整数
printf("原始值: 0x%08x\n", num); // 打印原始值
// 转换为相反字节序
change_byte_seq(&num, sizeof(num), 1); // 调用转换函数
printf("转换后: 0x%08x\n", num); // 打印转换结果(应显示0x78563412)
// 转换回来
change_byte_seq(&num, sizeof(num), 1); // 再次转换恢复原状
printf("恢复后: 0x%08x\n", num); // 打印恢复结果(应显示原始值)
}
int main() {
// 检测本机字节序
if (is_little_endian()) {
printf("本机是小端格式 (Little Endian)\n"); // 最低有效字节在前
} else {
printf("本机是大端格式 (Big Endian)\n"); // 最高有效字节在前
}
// 测试字节序转换
test_conversion(); // 执行测试案例
return 0; // 程序正常退出
}
关键代码段说明:
-
is_little_endian()
-
uint16_t num = 0x0001
:16位整数的内存布局在小端系统是01 00
,大端是00 01
-
*(uint8_t*)&num
:通过类型转换检查第一个字节的内容
-
-
change_byte_seq()
-
通过对称交换实现字节反转(例如
0x12345678
→0x78563412
) -
flag
参数当前未使用,但可扩展为方向控制(如0=大转小,1=小转大)
-
-
test_conversion()
-
演示转换的对称性:两次转换会恢复原始值
-
典型输出:
text
原始值: 0x12345678 转换后: 0x78563412 恢复后: 0x12345678
-
-
内存操作
-
(uint8_t*)p
:将任意类型指针转为字节指针,实现通用内存操作 -
size / 2
:只需遍历前半部分即可完成交换(避免重复操作)
-