2013-05-31 132 views
0

我想从CArchive正在写入的文件读取数据。我有使用CArchive进行读写的原始源代码。但是,我正在尝试通过C#代码读取它。我能够读取大部分文件,但是当我必须读取文件中写入的结构数组时,我才卡住。从CArchive读取二进制数据保存结构数组

我已经看到了其他问题在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,而第七或第八结构体后的所有字段都是256.现在这是错误的数据。我已经阅读了这个通过C++代码,并且工作正常。字段值可以是1或0,但是256个数据是完全无效的。

+0

CArchive如何对文件进行编码?它只是C++结构的平面副本吗? – Dirk

+0

您的C++字段与每个字段打包为1位的字段一起存储,但您的C#字段每个字段使用16位。我怀疑C++数据将被填充为每个结构2字节,最后7位未使用(设置为0)。如果在十六进制编辑器中查看二进制文件,是否符合您所看到的内容? –

+0

@Dirk写代码就像这样“cArchive.Write(m_data,length)”我现在没有代码,但它与此类似。 –

回答

0

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

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