从CArchive保存的二进制数据中读取结构数组

Read array of struct from binary data save by CArchive

本文关键字:读取 结构 数组 数据 二进制 CArchive 保存      更新时间:2023-10-16

我正在尝试从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#代码:

我struct

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));
}

现在在这个调用之后,当我检查structurecall时,节点数据不正确。对于集合中的第六个结构体,两个字段的值是256,在第七个或第八个结构体之后,所有字段的值都是256。这是错误的数据。我已经通过c++代码阅读了这个,并且工作得很好。字段值为1或0,但256个数据完全无效

您的c++结构是位域。它将占用一个WORD/ushort的内容。

你的c#版本使用了9个短字符,你似乎读到了这个长度