我正在尝试从CArchive正在写入的文件中读取数据。我有原始的源代码,这是用来读取和写入使用CArchive。但是,我正试图通过c#代码来阅读这个。我能够读取文件的大部分内容,但是当我必须读取文件中写入的结构数组时,我卡住了。
我在stackoverflow上看到过其他问题,但它们对我不起作用。
将二进制文件读入结构体
从字节数组中读取c#中的C/c++数据结构
他们所建议的是使用这个函数。
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 Read code:
m_data = new MyStruct[3600];
cArchiveReader.Read(m_data, 3600 * sizeof(MyStruct));
现在c#代码:
我structpublic 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));
}
现在在这个调用之后,当我检查structurecall时,节点数据不正确。对于集合中的第六个结构体,两个字段的值是256,在第七个或第八个结构体之后,所有字段的值都是256。这是错误的数据。我已经通过c++代码阅读了这个,并且工作得很好。字段值为1或0,但256个数据完全无效
您的c++结构是位域。它将占用一个WORD/ushort的内容。
你的c#版本使用了9个短字符,你似乎读到了这个长度