我正在尝试从CArchive编写的文件中读取数据。我有原始源,用于使用CArchive进行读写。但是,我试图通过C#代码来阅读它。我能够读取大部分文件,但是当我必须读取文件中写入的struct数组时,我就陷入了困境。
我在stackoverflow上看到了其他问题,但它们对我没用。
Read binary file into a struct
Reading a C/C++ data structure in C# from a byte array
他们建议使用此功能。
public static T ByteToType<T>(BinaryReader reader)
{
byte[] bytes = reader.ReadBytes(Marshal.SizeOf(typeof(T)));
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
T theStructure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
handle.Free();
return theStructure;
}
但这对我来说不行。
所以这是我的C ++代码:
结构:
struct MyStruct
{
WORD field1 : 1;
WORD field2 : 1;
WORD field3 : 1;
WORD field4 : 1;
WORD field5 : 1;
WORD field6 : 1;
WORD field7 : 1;
WORD field8 : 1;
WORD field9 : 1;
};
CArchive阅读代码:
m_data = new MyStruct[3600];
cArchiveReader.Read(m_data, 3600 * sizeof(MyStruct));
现在C#代码:
我的结构
public struct MyStruct
{
ushort field1;
ushort field2;
ushort field3;
ushort field4;
ushort field5;
ushort field6;
ushort field7;
ushort field8;
ushort field9;
}
**Reading Code:**
var stream = new MemoryStream(bytes);
var reader = new BinaryReader(stream);
for (int I=0; I<3600; I++)
{
structureCollection.Add(ByteToType<NodeFlag>(reader));
}
现在在此调用之后,当我检查structureCollection时,节点数据不正确。对于集合中的第六个结构,两个字段的值是256,而在第7或第8个结构之后,所有字段都是256.现在这是错误的数据。我已经通过C ++代码阅读了这个并且工作正常。字段值为1或0,但256个数据完全无效。
答案 0 :(得分:0)
您的C ++结构是一个位域。它将占用内容中的单个WORD / ushort。
你的C#版本使用了9个你似乎读过这个长度的短信。