2

我目前的设计涉及嵌入式系统和 PC 之间的通信,我总是被结构设计所困扰。

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

例如,像这样的结构:

{
    uint16_t a;
    uint32_t b;
}

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

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

谢谢。

4

1 回答 1

0

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

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

于 2012-10-29T18:54:11.033 回答