我有一个12字节的数据包要发送格式:
+--------+------+ | ID | ver | +--------+------+
ID为8个字节,ver为4个字节。我已经声明了一个结构如下,但我的PC给了我一个16字节的大小值(8 + 4 + 4字节的填充)。 #pragma
解决了这个问题,但是有什么方法可以解决这个问题吗?
struct pak
{
char *ID;
uint32_t ver;
};
答案 0 :(得分:5)
最通用,便携且防错的解决方案是根本不关心填充。
您可以使用例如memcpy
将结构序列化和反序列化为字符数组,而不是按原样发送结构。
您不应忘记字节顺序 - 有关详细信息,请参阅ntohl
和ntohs
的文档。
答案 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指针。