一个可以检测本机的字节顺序,并对任意数据进行字节顺序的反转操作的代码。

复制代码
#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;          // 程序正常退出
}

关键代码段说明:

  1. is_little_endian()

    • uint16_t num = 0x0001:16位整数的内存布局在小端系统是01 00,大端是00 01

    • *(uint8_t*)&num:通过类型转换检查第一个字节的内容

  2. change_byte_seq()

    • 通过对称交换实现字节反转(例如0x123456780x78563412

    • flag参数当前未使用,但可扩展为方向控制(如0=大转小,1=小转大)

  3. test_conversion()

    • 演示转换的对称性:两次转换会恢复原始值

    • 典型输出:

      text

      复制代码
      原始值: 0x12345678  
      转换后: 0x78563412  
      恢复后: 0x12345678
  4. 内存操作

    • (uint8_t*)p:将任意类型指针转为字节指针,实现通用内存操作

    • size / 2:只需遍历前半部分即可完成交换(避免重复操作)

相关推荐
richxu202510011 分钟前
嵌入式学习之路->stm32篇->(14)通用定时器(上)
stm32·单片机·嵌入式硬件·学习
Deitymoon4 分钟前
STM32——串口通信(USART)
单片机·嵌入式硬件
iCxhust6 分钟前
微机原理实践教程(C语言篇)---A002流水灯
c语言·开发语言·单片机·嵌入式硬件·51单片机·课程设计·微机原理
晨曦夜月10 分钟前
map与unordered_map区别
算法·哈希算法
图码35 分钟前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler0143 分钟前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
minglie11 小时前
实数列的常用递推模式
算法
代码小书生1 小时前
math,一个基础的 Python 库!
人工智能·python·算法
AI科技星1 小时前
全域数学·数术本源·高维代数卷(72分册)【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算
生成论实验室1 小时前
《事件关系阴阳博弈动力学:识势应势之道》第一篇:生成正在发生——从《即事经》到事件-关系网络
人工智能·科技·算法·架构·创业创新