从CArchive中读取二进制数据中的struct数组

时间:2013-05-31 13:59:43

标签: c# c++ binary-data carchive

我正在尝试从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个数据完全无效。

1 个答案:

答案 0 :(得分:0)

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

你的C#版本使用了9个你似乎读过这个长度的短信。