gpt4 book ai didi

将缓冲区转换为结构指针

转载 作者:行者123 更新时间:2023-11-30 14:53:32 24 4
gpt4 key购买 nike

我有一个缓冲区并希望将其转换为指向结构的指针:

#include <stdint.h>
#include <stdio.h>

struct __attribute__((packed)) req {
uint8_t a;
uint16_t b;
uint8_t *c;
};


void f(uint8_t *Buf)
{
struct req *r = (struct req *)Buf;

printf("a: %02x\n", r->a);
printf("b: %04x\n", r->b);
printf("c: %02x\n", r->c[0]);

}

int main()
{
uint8_t buf[] = {0x01, 0x02, 0x03, 0x04 };

f(buf);

return 0;
}

该示例不起作用,因为第 4 个字节不是地址,而是实际数据。我可以通过手动设置指针来“修复”这个问题:

r->c = &Buf[3];

有什么办法可以通过 Actor 来做到这一点吗?

最佳答案

Is there any way to do this with a cast?

不,出于多种原因:

  • 正如你所说,字节流与结构体不对应。最后一项不是指针。唯一可以使用强制转换的时候是当您知道目标位置存储的实际数据与目标变量的类型相同时。
  • 强制转换会调用未定义的行为,因为它违反了 the strict aliasing rule 。任何事情都可能发生。
  • 字节流中的各种数据似乎未对齐,这可能是也可能不是问题,具体取决于系统。

在这种情况下,您必须手动反序列化数据:

struct req r = { buf[0], 
(uint16_t)buf[1]<<8 | buf[2], // assumes big endian
&buf[3] };

在这里我们注意到代码也依赖于字节序。因此,您必须知道该数据来自的系统/协议(protocol)的字节顺序,以便正确地反序列化它。

关于将缓冲区转换为结构指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47157378/

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