如何发送带填充字段的结构?

时间:2012-12-28 11:38:13

标签: c

我有一个12字节的数据包要发送格式:

+--------+------+
| ID     | ver  |
+--------+------+

ID为8个字节,ver为4个字节。我已经声明了一个结构如下,但我的PC给了我一个16字节的大小值(8 + 4 + 4字节的填充)。 #pragma解决了这个问题,但是有什么方法可以解决这个问题吗?

struct pak
{
  char *ID;
  uint32_t ver;
};

3 个答案:

答案 0 :(得分:5)

最通用,便携且防错的解决方案是根本不关心填充。

您可以使用例如memcpy将结构序列化和反序列化为字符数组,而不是按原样发送结构。

将数据发送到其他设备时,

您不应忘记字节顺序 - 有关详细信息,请参阅ntohlntohs的文档。

答案 1 :(得分:0)

struct pak
{
  char *ID;
  uint32_t ver;
}__attribute__((packed));

使用上面没有额外的填充..

答案 2 :(得分:0)

看起来像8byte边界上的平台对齐结构。 gcc可以选择更改它。 如果你希望打包4byte边界编译启用-fpack-struct = 4选项。但要小心,它可能会减慢内存分配。 (有关详细信息,请参阅gcc手册)

如果您不是编写平台相关代码而不是使用char指针,那么您可以使用uint64_t。请记住,32位平台将为您提供4byte指针。