1

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

+--------+------+
| 身份证 | 版本 |
+--------+------+

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

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

3 回答 3

5

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

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

将数据发送到其他设备时,您不应忘记字节顺序ntohl- 有关详细信息,请参阅文档ntohs

于 2012-12-28T11:47:51.813 回答
0
struct pak
{
  char *ID;
  uint32_t ver;
}__attribute__((packed));

Use above for no extra padding..

于 2012-12-28T12:04:22.723 回答
0

看起来您的平台在 8 字节边界上对齐结构。gcc 可以选择改变这一点。如果您希望打包 4 字节边界,请在启用 -fpack-struct=4 选项的情况下进行编译。但要小心它可能会减慢内存分配。(有关更多详细信息,请参阅 gcc 手册)

如果您不编写依赖于平台的代码而不是使用 char 指针,则可以选择 uint64_t。记住,32 位平台会给你 4 字节的指针。

于 2012-12-28T12:21:49.950 回答