亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial Internet of Things >> 嵌入式

C 语言联合体实现高效数据打包与解包详解

C 语言联合体实现高效数据打包与解包

联合体提供了一种强大且内存高效的方式,将同一字节序列重新解释为不同数据类型。虽最初设计用于互斥变量共享内存,现代 C 程序员常用联合体进行数据打包、解包和类型双关——特别是处理串行协议或底层通信时。

联合体如何共享内存

联合体所有成员共享同一内存区域。最大成员决定联合体大小,每个成员起始地址相同。

union { uint16_t word; struct { uint8_t byte1; uint8_t byte2; }; } u1;

此处 word 占两字节,嵌套结构将这两字节拆分为 byte1 和 byte2。内存布局可视化为:

C 语言联合体实现高效数据打包与解包详解

将两字节打包为 16 位字

要将两个 8 位值 x 和 y 合并为 16 位字,赋值给结构成员再读取 word 成员:

u1.byte1 = y; u1.byte2 = x; uint16_t packed = u1.word;

这种“数据双关”直观但依赖处理器字节序。

处理器字节序的影响

小端系统先存储最低有效字节,大端系统先存储最高有效字节。以序列 0x01020304 为例:

C 语言联合体实现高效数据打包与解包详解

在小端机器运行简单测试:

#include <stdio.h> #include <stdint.h> int main() { union { struct { uint8_t byte1; uint8_t byte2; }; uint16_t word; } u1; u1.byte1 = 0x21; u1.byte2 = 0x43; printf("Word is: %#X\n", u1.word); return 0; }

输出:Word is: 0X4321——确认小端存储。大端目标相同代码输出 0X2143。

位运算替代方案:与字节序无关的打包

移位和掩码提供跨架构可移植的 16 位值构建方式:

uint16_t word2 = (((uint16_t)byte3) << 8) | ((uint16_t)byte4);

对比两种方法:

#include <stdio.h> #include <stdint.h> int main() { union { struct { uint8_t byte1; uint8_t byte2; }; uint16_t word1; } u1; u1.byte1 = 0x21; u1.byte2 = 0x43; printf("Word1 is: %#X\n", u1.word1); uint8_t byte3 = 0x21, byte4 = 0x43; uint16_t word2 = (((uint16_t)byte3) << 8) | ((uint16_t)byte4); printf("Word2 is: %#X\n", word2); return 0; }

大端处理器:Word1 is: 0X2143,Word2 is: 0X2143。小端处理器:Word1 is: 0X4321,Word2 is: 0X2143。位运算方法保证跨架构结果一致。

实战示例:通过 UART 发送浮点数

串行链路通常逐字节传输。发送 32 位 float 可用联合体将其视为四字节数组:

union buffer { float f; struct { uint8_t byte[4]; }; };

发送端:

union buffer tx; union buffer rx; float f1 = 5.5f; tx.f = f1; for (int i = 0; i < 4; ++i) { // send tx.byte[i] over UART rx.byte[i] = tx.byte[i]; // 模拟接收 } printf("The received data is: %f\n", rx.f); 

输出:The received data is: 5.500000。联合体清晰分离字节表示与浮点值,代码可读性强且易维护。

C 语言联合体实现高效数据打包与解包详解

核心要点

探索更多 C 语言、联合体和嵌入式系统内容,浏览完整文章列表。

嵌入式

  1. 美军推进状态基础维护:创新传感器与预测分析助力
  2. Litmus与Oden推出集成IIoT解决方案赋能智能制造
  3. 解锁供应链可视性:数据与上下文的关键作用
  4. 革新车队管理:AI 与 IoT 融合驱动智能运营
  5. Armv9:提升安全性与 AI 性能
  6. Nucleus RTOS信号量:实用服务与数据结构
  7. CyrusOne 借实时应用监控提升用户体验
  8. IIoT与数据分析如何变革EHS:提升安全、效率与节约
  9. 构建负责任可信AI:可解释性、问责制与伦理三大支柱实战指南
  10. 雾计算详解:变革物联网数据流、减轻云端负载
  11. 工业AIoT:AI与物联网融合驱动工业4.0创新
  12. C 语言联合体详解:多类型数据共享内存的高效管理