我有一个问题(我认为它可以轻松解决,但它让我发疯)。我查过了其他帖子,但我找不到解决方案。
我想使用C ++ / CLI将二进制文件读入结构。问题是,在阅读之后,某些值与正确的值不符。在下面的示例中,所有结构字段都可以很好地读取,直到" a" (包括)(在字节100左右)。从那个领域,其余的都有错误的价值观。我知道他们有错误的值,源文件是正确的,因为我以前使用过python,而{C 1}}和FileStream
来自C ++ / CLI。但是,我不再使用它们,因为我想将二进制文件读入结构。
此外,在某些情况下,我对变量" size"的值也为-1。 (文件的大小),但并非总是如此。我不确定当文件太大时是否会出现错误的值。
因此,我的问题是你能看到我不能做的事,或者我做错了什么。
BinaryReader
谢谢!
巴勃罗。
答案 0 :(得分:1)
这里有几件事。我先解决直接问题。
你没有说这个二进制格式是如何编写的,但我认为这是一个对齐问题。
如果没有#pragma pack
指令,unsigned long b
将对齐到4字节边界。结构成员x
到a
总共为90个字节,因此在a
和b
之间插入两个填充字节,以便b
正确对齐。
要修复对齐方式,您可以使用#pragma pack(push, 1)
和#pragma pack(pop)
围绕结构。
第二,更全面的问题:
您调用了此C ++ / CLI代码,并将其标记为C ++ / CLI,但您实际上并未在此代码中使用任何托管功能。另外,你说你有一些使用BinaryReader
工作的C#代码,而BinaryReader
在C ++ / CLI中工作正常,所以你在技术上已经掌握了C ++ / CLI解决方案。
如果C ++ / CLI项目的其余部分是这种方式(不使用托管代码),请考虑将项目切换为C ++,或者将其拆分。如果您的项目主要使用托管代码,那么我强烈建议您使用BinaryReader
代替fopen
来阅读此数据。