0

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

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

现在在这个电话之后,当我检查结构集合时,节点数据不正确。对于集合中的第六个结构,两个字段的值是 256,在第 7 或第 8 个结构之后,所有字段都是 256。现在这是错误的数据。我已经通过 C++ 代码阅读了这篇文章,并且效果很好。字段值为 1 或 0,但 256 数据完全无效。

4

1 回答 1

0

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

您的 C# 版本使用 9 个 ushorts,您似乎阅读了该长度。

于 2013-05-31T14:17:13.013 回答