打包结构时,处理字节对齐和字节顺序的好方法是什么?

时间:2012-10-29 18:27:58

标签: byte endianness memory-alignment

我目前的设计涉及嵌入式系统和PC之间的通信,我总是对结构设计感到茫然。

这两个系统具有我需要处理的不同的endianess。但是,我发现我不能只为每4个字节做一个简单的字节顺序切换来解决问题。事实证明这取决于结构。

例如,像这样的结构:

{
    uint16_t a;
    uint32_t b;
}

会导致a和b之间的填充。最终,endian开关必须特定于a和b,因为填充字节的存在。但它看起来很难看,因为我每次更改结构内容时都需要更改endian开关逻辑。

当填充进入时,在结构中排列元素的好策略是什么?我们应该尝试重新排列元素,以便在结构的末尾只有填充字节吗?

感谢。

1 个答案:

答案 0 :(得分:0)

我担心你需要做一些更加平台无关的序列化,因为不同的架构有不同的对齐要求。我不认为有一种安全和通用的方式来做一些事情,比如抓住一块内存并将其发送到另一个架构,你只需将它放在某个地址并从中读取(正确的数据) )。只需逐个转换和发送元素 - 您可以将值推送到缓冲区,不会有任何填充,您将确切知道它在哪里。另外,您决定哪个部分将进行转换(通常PC有更多资源来执行此操作)。作为奖励,您可以校验/签署通信以捕获错误/篡改。

BTW,afaik虽然编译器保持变量的顺序完整,理论上它可以在它们之间添加一些额外的填充(例如出于性能原因),所以它不仅仅是与架构相关的东西。