我有一个 12 字节的数据包要发送,格式如下:
+--------+------+ | 身份证 | 版本 | +--------+------+
ID 为 8 个字节,ver 为 4 个字节。我已经声明了一个结构如下,但我的 PC 给了我一个 16 字节的大小值(8 + 4 + 4 字节的填充)。#pragma
解决了这个问题,但是有什么办法可以解决这个问题吗?
struct pak
{
char *ID;
uint32_t ver;
};
我有一个 12 字节的数据包要发送,格式如下:
+--------+------+ | 身份证 | 版本 | +--------+------+
ID 为 8 个字节,ver 为 4 个字节。我已经声明了一个结构如下,但我的 PC 给了我一个 16 字节的大小值(8 + 4 + 4 字节的填充)。#pragma
解决了这个问题,但是有什么办法可以解决这个问题吗?
struct pak
{
char *ID;
uint32_t ver;
};
最通用、便携和防错的解决方案是根本不关心填充。
您可以将结构序列化和反序列化为字符数组,而不是按原样发送结构,例如,使用memcpy
.
将数据发送到其他设备时,您不应忘记字节顺序ntohl
- 有关详细信息,请参阅文档ntohs
。
struct pak
{
char *ID;
uint32_t ver;
}__attribute__((packed));
Use above for no extra padding..
看起来您的平台在 8 字节边界上对齐结构。gcc 可以选择改变这一点。如果您希望打包 4 字节边界,请在启用 -fpack-struct=4 选项的情况下进行编译。但要小心它可能会减慢内存分配。(有关更多详细信息,请参阅 gcc 手册)
如果您不编写依赖于平台的代码而不是使用 char 指针,则可以选择 uint64_t。记住,32 位平台会给你 4 字节的指针。