【问题标题】:Accessing member of struct in C++在 C++ 中访问结构的成员
【发布时间】:2016-09-19 07:24:08
【问题描述】:

我正在尝试使用结构定义访问二进制文件中的某些数据成员。

在 thi 文件中,它应该包含一个名为 fxID 的结构成员。在下面的代码中,我试图访问 fxID,但它不起作用,它返回的数字不正确。更奇怪的是,如果我将 fxID 更改为 fxVersion,我会得到相同的数字,因此 printf 似乎根本没有获取正确的数据。

FILE *p;
struct myStruct x;
p=fopen("myfile.fxb","rb");

size_t n = fread(&x, sizeof(x), 1, p);
if (n != 1) {
    // Some error message
    //printf("%i", sizeof(x));
} else {
    printf("\n\nID:%d\n",  x.fxID);
}

知道为什么我不能访问 fxID 中的数据吗?根据我在 printf 语句中使用的类型,我得到了奇怪的结果。例如,如果我使用 printf("%d", x.fxID); ,我会得到数字 1606416148;但是,这是错误的,因为我相信 fxID 是 1447514692。这是因为字节序吗?我知道这个文件是大端的,它提到了需要在我链接到的头文件中转换它。

可能是因为使用了 Int 吗?或者是错误的类型?

【问题讨论】:

  • 我觉得我有似曾相识的感觉 - stackoverflow.com/questions/39556266/…
  • 可能需要在文件开头添加一个关于版本的标记,即VST_2_4_EXTENSIONS
  • 是的,我忘了在我自己的结构定义中添加它,我正在删除 if 语句,并且我仍在试图理解为什么我无法以有意义的方式访问结构内的数据。我遇到的问题仍然没有找到解决方案。
  • 您需要有一个版本标记,然后在写入时序列化数据(也许将内容按网络顺序排列)并在读取时反序列化
  • 嗨,Ed,我不写这个数据,现在只读。阅读时如何反序列化??

标签: c++ struct binary fopen


【解决方案1】:

如果文件中使用的字节序与平台使用的字节序不同,则必须更正字节序。如果格式是使用大端布局存储的,那么如果您使用的是 x64,则必须交换每个多字节字段的字节。

但这还不足以保证struct 的布局与文件格式中使用的布局相同,因为它可能包含填充和对齐要求,所以一般来说,如果你想直接反序列化内部的二进制数据一个struct你必须照顾很多事情。

在任何情况下,如果获得的结果是 1606416148 并且您期待 1447514692,那么字节序不是唯一的问题,因为两者在十六进制中分别是 0x5FBFF7140x56475244,它们与不同的字节序。

您正在使用&x.fxID,它返回结构内fxID字段的地址,不是值,请尝试直接使用x.fxID

【讨论】:

  • 好的,已经直接改成x.fxID了,现在返回0。不知道为什么?它应该是 1447514692。我也无法访问结构的其他部分,例如 fxVersion。你有没有机会检查我附上的文件来确认?
  • 奇怪的是,当我使用 x.byteSize 时,它​​给了我一个十六进制值 6b427846,即 kBxF,这向后(由于大端)是 FxBk。那么为什么 FxBk 消息会在变量 byteSize 中出现,而应该在 fxMagic 中找到呢?显然数据以某种方式未对齐?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2014-11-30
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
相关资源
最近更新 更多