我想从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个数据是完全无效的。
CArchive如何对文件进行编码?它只是C++结构的平面副本吗? – Dirk
您的C++字段与每个字段打包为1位的字段一起存储,但您的C#字段每个字段使用16位。我怀疑C++数据将被填充为每个结构2字节,最后7位未使用(设置为0)。如果在十六进制编辑器中查看二进制文件,是否符合您所看到的内容? –
@Dirk写代码就像这样“cArchive.Write(m_data,length)”我现在没有代码,但它与此类似。 –