使用C ++ / CLI将二进制文件读入结构

时间:2018-04-24 15:35:50

标签: c++-cli binaryfiles

我有一个问题(我认为它可以轻松解决,但它让我发疯)。我查过了其他帖子,但我找不到解决方案。

我想使用C ++ / CLI将二进制文件读入结构。问题是,在阅读之后,某些值与正确的值不符。在下面的示例中,所有结构字段都可以很好地读取,直到" a" (包括)(在字节100左右)。从那个领域,其余的都有错误的价值观。我知道他们有错误的值,源文件是正确的,因为我以前使用过python,而{C FileStream来自C ++ / CLI。但是,我不再使用它们,因为我想将二进制文件读入结构。

此外,在某些情况下,我对变量" size"的值也为-1。 (文件的大小),但并非总是如此。我不确定当文件太大时是否会出现错误的值。

因此,我的问题是你能看到我不能做的事,或者我做错了什么。

BinaryReader

谢谢!

巴勃罗。

1 个答案:

答案 0 :(得分:1)

这里有几件事。我先解决直接问题。

你没有说这个二进制格式是如何编写的,但我认为这是一个对齐问题。

如果没有#pragma pack指令,unsigned long b将对齐到4字节边界。结构成员xa总共为90个字节,因此在ab之间插入两个填充字节,以便b正确对齐。

要修复对齐方式,您可以使用#pragma pack(push, 1)#pragma pack(pop)围绕结构。

第二,更全面的问题:

您调用了此C ++ / CLI代码,并将其标记为C ++ / CLI,但您实际上并未在此代码中使用任何托管功能。另外,你说你有一些使用BinaryReader工作的C#代码,而BinaryReader在C ++ / CLI中工作正常,所以你在技术上已经掌握了C ++ / CLI解决方案。

如果C ++ / CLI项目的其余部分是这种方式(不使用托管代码),请考虑将项目切换为C ++,或者将其拆分。如果您的项目主要使用托管代码,那么我强烈建议您使用BinaryReader代替fopen来阅读此数据。