将序列化结构从 8 位系统复制到 32 位系统

Copying serialized struct from an 8-bit system to a 32-bit system

我有一块板子,它有一个 32 位 ARM CPU 作为主处理器,一个 8 位 AVR 微控制器作为连接到它的从属设备。

我正在复制一个结构体(slave将其转换为字节流,master接收并将其存储在具有相同定义的结构体的内存位置)。

master 和slave 都在各自的控制台上打印struct 成员的值。但是这些值不匹配。

我发现问题的发生是因为 master 中结构的实际内存分配发生了一些变化,以与 16 位边界对齐。即小于 16 位的数据类型升级为 16 位。

结构中有一些 8 位整数 (u8),实际上在 Master 的内存中分配了 2 个字节,而在 slave 中,它们仅按预期分配了 1 个字节。

不出所料,sizeof(STRUCT_NAME) 在每个系统中产生不同的结果。

我找到了解决这个问题的方法,在必要时在传入数据中插入填充字节。

在这种情况下,是否有任何标准方法来处理结构序列化?

我在 ARM 部分使用 GCC。

struct _str
{
    ...
} __attribute__((packed, aligned(1))) struct_name;

对齐到 1 个字节。

明确定义数据在传输过程中的表示方式,然后明确地编程与字节流之间的转换。

您可以使用移位和掩码操作来完成此操作。有了一些常见数字类型的辅助函数,这就很容易管理了。

通过这种方式,您可以避免因不同的字节顺序和结构打包而导致的所有可移植性问题。