当前位置: 首页 > web >正文

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

#include <stdio.h>      // 标准输入输出库,用于printf等函数
#include <stdint.h>     // 标准整数类型库,提供uint8_t、uint16_t等类型
#include <string.h>     // 字符串操作库(虽然当前代码未直接使用,但常用于内存操作)// 检测本机是大端还是小端格式
int is_little_endian() {uint16_t num = 0x0001;          // 创建一个16位整数,值为0x0001return *(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()

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

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

  3. test_conversion()

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

    • 典型输出:

      text

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

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

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

http://www.xdnf.cn/news/16933.html

相关文章:

  • 热能小车cad【12张】三维图+设计说明书
  • 解决IDEA无法克隆GitHub上的工程的问题
  • STM32F103C8T6 BC20模块采集温湿度和经纬度发送到ONENET
  • AI+向量化
  • 《React Router深解:复杂路由场景下的性能优化与导航流畅性构建》
  • 全方位监控与智能控制应用
  • Linux文件操作:从C接口到系统调用
  • 浏览器【详解】自定义事件 CustomEvent
  • 台式机 Server 20.04 CUDA11.8
  • Linux 用户与组管理及权限委派
  • Blender 智能模型库 | 人物·建筑·场景·机械等 近万高精度模型
  • 嵌入式 Linux 深度解析:架构、原理与工程实践(增强版)
  • AG-UI 协议全面解析--下一代 AI Agent 交互框架医疗应用分析(上)
  • k8s云原生rook-ceph pvc快照与恢复(上)
  • NLP 和 LLM 区别、对比 和关系
  • 四、基于SpringBoot,MVC后端开发笔记
  • 【Mysql】联合索引生效分析案例
  • 【Electron】打包后图标不变问题,图标问题
  • JavaWeb笔记2-JavaScriptVueAjax
  • PyTorch分布式训练:从入门到精通
  • AG-UI 协议全面解析--下一代 AI Agent 交互框架医疗应用分析(下)
  • Js引用数据类型和ES6新特性
  • Python调用C++动态库
  • k8s云原生rook-ceph pvc快照与恢复(下)
  • 【Halcon 】Halcon 实战:如何为 XLD 模板添加极性信息以提升匹配精度?
  • iPhone 恢复出厂设置是否会删除所有内容?
  • 流式输出阻塞原因及解决办法
  • Pydantic模块学习
  • vivado扫盲:dcp(腾讯元宝)
  • QT6 源,十章绘图(2)画刷 QBrush:刷子只涉及填充颜色,线型,填充图片,以及变换矩阵这几个属性,附源代码带注释。