gpt4 book ai didi

c - 将二进制数据读入内存结构,奇怪的效果

转载 作者:行者123 更新时间:2023-12-04 10:44:34 25 4
gpt4 key购买 nike

我已经研究了一段时间了,这让我很困惑。这是一个重现问题的非常精炼的代码片段:

uint8_t dataz[] = { 1, 2, 3, 4, 5, 6 };

struct mystruct {

uint8_t dummy1[1];
uint16_t very_important_data;
uint8_t dummy2[3];

} *mystruct = (void *) dataz;

printf("%x\n", mystruct -> very_important_data);

您期望输出结果是什么?我会说 x302,但不是。它给了我 x403。与使用此结构相同:

struct mystruct {

uint8_t dummy1[2];
uint16_t very_important_data;
uint8_t dummy2[2];

} *mystruct = (void *) dataz;

你怎么解释?

最佳答案

正如其他人所提到的,除非您的编译器对齐方式是字节对齐的,否则您的结构中可能会有“漏洞”。编译器这样做是因为它加速了内存访问。

如果您使用的是 gcc,则有一个“packed”属性会导致结构字节对齐,因此删除“holes”:

struct __attribute((__packed__)) mystruct {
uint8_t dummy1[1];
uint16_t very_important_data;
uint8_t dummy2[3];
} *mystruct = (void *) dataz;

但是,这不一定能解决问题。 16 位值可能未设置为您认为应有的值,具体取决于您机器的字节顺序。您将必须交换结构中任何多字节整数中的字节。没有执行此操作的通用函数,因为它需要有关运行时结构布局的信息,而 C 没有提供。

将结构映射到二进制数据通常是不可移植的,即使您现在就可以在您的机器上使用它也是如此。

关于c - 将二进制数据读入内存结构,奇怪的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2970363/

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