You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单片机环境下C++字节数组按pkg_type反序列化为对应结构体的优雅实现

单片机环境下二进制数据包的优雅反序列化方案

针对单片机上的需求,不需要实例化所有结构体做冗余复制,直接通过类型指针转换结合包类型判断就能实现高效反序列化,完全符合低开销、省内存的要求。

核心实现思路

  1. 读取缓冲区首字节获取pkg_type,匹配对应的结构体类型
  2. 将transmission_buffer的地址强制转换为目标结构体的指针,无需额外内存分配或拷贝
  3. 处理字节序差异(单片机常涉及大端/小端问题,避免解析错误)

具体代码实现

#include <stdint.h>
#include <string.h>

// 原有的结构体与枚举定义
struct PackageTypeA {
    uint8_t pkg_type;
    uint8_t content1;
    uint16_t content2;
};

struct PackageTypeB {
    uint8_t pkg_type;
    uint8_t content;
};

uint8_t transmission_buffer[64];

enum PackageType : uint8_t {
    PackageTypeA = 2,
    PackageTypeB = 66
};

// 字节序转换工具函数(根据单片机实际字节序调整)
static inline uint16_t swap_uint16(uint16_t val) {
    return ((val >> 8) & 0xFF) | ((val << 8) & 0xFF00);
}

// 反序列化处理函数
void deserialize_packet() {
    PackageType pkg_type = (PackageType)transmission_buffer[0];
    
    switch(pkg_type) {
        case PackageTypeA: {
            // 直接将缓冲区地址转为结构体指针,无内存拷贝
            const struct PackageTypeA* pkg = (const struct PackageTypeA*)transmission_buffer;
            // 处理字节序:若发送端与本地字节序不同,转换多字节字段
            uint16_t content2 = swap_uint16(pkg->content2);
            // 这里编写业务逻辑,比如使用pkg->content1和content2
            break;
        }
        case PackageTypeB: {
            const struct PackageTypeB* pkg = (const struct PackageTypeB*)transmission_buffer;
            // 业务逻辑:使用pkg->content
            break;
        }
        default:
            // 处理未知包类型的错误逻辑
            break;
    }
}

关键注意事项

  • 内存对齐:确保结构体的内存布局和发送端一致,编译器可能自动添加填充字节。可通过编译指令强制结构体紧凑排列(如GCC的__attribute__((packed))):
    struct __attribute__((packed)) PackageTypeA {
        uint8_t pkg_type;
        uint8_t content1;
        uint16_t content2;
    };
    
  • 字节序检查:发送端和接收端必须统一字节序,或在接收时显式转换。若两端字节序一致,可跳过转换步骤。
  • 缓冲区边界:转换前可检查缓冲区长度是否足够容纳目标结构体(如sizeof(PackageTypeA) <= sizeof(transmission_buffer)),避免越界访问。

内容的提问来源于stack exchange,提问作者Raflemakt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:01:31