gpt4 book ai didi

c - sizeof() 结构无效,成员之间存在间隙

转载 作者:行者123 更新时间:2023-11-30 15:57:49 25 4
gpt4 key购买 nike

我有一个这样的结构:

typedef struct _HEADER_IO
{
uint8_t field1 : 2;
uint8_t field2 : 4;
uint8_t field3 : 1;
uint8_t field4 : 1;
uint16_t field5;
uint8_t field6;
} HEADER_IO;

它基本上是通过 TCP 发送的消息 header 。服务器读取此内容以便知道缓冲区中接下来的数据。然而,由于某种原因,大小不是 4 字节(2+4+1+1 第一个字节 + 字段 5 的 2 个字节 + 1 个字节字段 6),而是 6 个字节。

在内存 View 中查找它是:

XX AA XX XX XX AA

而不是:

XX XX XX XX

无论我做什么,AA 都不会被设置。这是一个问题,因为我计划将 header send() 发送到服务器,并且包含额外的字节,使服务器错误地解释 header 。我做错了什么?

最佳答案

一般来说,对于这些事情使用位域是一个坏主意。因为您无法事先确切知道这些位最终会出现在哪个字节中,并且存在填充和对齐问题。

在我看来,最好“承认”这样一个事实:您需要比 C 结构所提供的更多的外部表示控制,并手动完成。您当然可以将该结构保留为内存中(内部)表示形式。

基本上,您可以编写如下函数:

size_t header_serialize(unsigned char *buf, size_t max, const HEADER_IO *header);

其工作是在 buf 的内存中构建表示 header 的正确字节序列。

为了澄清(基于评论),目的是从 header 读取字段,而不仅仅是执行例如

memcpy(buf, header, sizeof *header);  /* DON'T DO THIS! */

相反,您应该从 header 的字段中逐字节组装预期的外部表示形式。这样,无论编译器对 header 的内存格式执行什么操作,您始终会获得相同的外部表示形式。

关于c - sizeof() 结构无效,成员之间存在间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10228010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com