我目前的设计涉及嵌入式系统和PC之间的通信,我总是对结构设计感到茫然。
这两个系统具有我需要处理的不同的endianess。但是,我发现我不能只为每4个字节做一个简单的字节顺序切换来解决问题。事实证明这取决于结构。
例如,像这样的结构:
{
uint16_t a;
uint32_t b;
}
会导致a和b之间的填充。最终,endian开关必须特定于a和b,因为填充字节的存在。但它看起来很难看,因为我每次更改结构内容时都需要更改endian开关逻辑。
当填充进入时,在结构中排列元素的好策略是什么?我们应该尝试重新排列元素,以便在结构的末尾只有填充字节吗?
感谢。
答案 0 :(得分:0)
我担心你需要做一些更加平台无关的序列化,因为不同的架构有不同的对齐要求。我不认为有一种安全和通用的方式来做一些事情,比如抓住一块内存并将其发送到另一个架构,你只需将它放在某个地址并从中读取(正确的数据) )。只需逐个转换和发送元素 - 您可以将值推送到缓冲区,不会有任何填充,您将确切知道它在哪里。另外,您决定哪个部分将进行转换(通常PC有更多资源来执行此操作)。作为奖励,您可以校验/签署通信以捕获错误/篡改。
BTW,afaik虽然编译器保持变量的顺序完整,理论上它可以在它们之间添加一些额外的填充(例如出于性能原因),所以它不仅仅是与架构相关的东西。