将文件读入类型大于字节的结构
Reading file into struct with types bigger then byte
我使用以下代码将文件读入结构:
StructType aStruct;
int count = Marshal.SizeOf(typeof(StructType));
byte[] readBuffer = new byte[count];
BinaryReader reader = new BinaryReader(stream);
readBuffer = reader.ReadBytes(count);
GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
aStruct = (StructType) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(StructType));
handle.Free();
但我注意到任何大于字节的变量,如 int32、int16 都会向后接收数据。例如,如果文件中的数据是:AA BB CC DD
相应的变量(int32)将是:DD CC BB AA.
我的结构是用属性 [StructLayout(LayoutKind.Sequential), Pack = 1]
定义的
有人知道为什么以及如何解决吗?
谢谢!
如果文件使用大端字节顺序,就会发生这种情况,但当然结构的数据成员是小端字节序,对此您无能为力。没有更改结构字段字节顺序的布局说明符,它是平台的 属性。有一些选项可以处理大端文件:
- 如果您可以更改文件格式,那将是一个简单的解决方案。这将使加载和保存文件更容易。
- 读取结构及其字段 "the wrong way around",然后遍历所有字段并使用一些位操作翻转它们,like this。不小心把字段弄错顺序是比较容易的。
- 放弃直接阅读简单的方法,而是一个一个地阅读字段,每个字段都采用大端字节序,例如使用 these options 之一。
我使用以下代码将文件读入结构:
StructType aStruct;
int count = Marshal.SizeOf(typeof(StructType));
byte[] readBuffer = new byte[count];
BinaryReader reader = new BinaryReader(stream);
readBuffer = reader.ReadBytes(count);
GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
aStruct = (StructType) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(StructType));
handle.Free();
但我注意到任何大于字节的变量,如 int32、int16 都会向后接收数据。例如,如果文件中的数据是:AA BB CC DD 相应的变量(int32)将是:DD CC BB AA.
我的结构是用属性 [StructLayout(LayoutKind.Sequential), Pack = 1]
有人知道为什么以及如何解决吗?
谢谢!
如果文件使用大端字节顺序,就会发生这种情况,但当然结构的数据成员是小端字节序,对此您无能为力。没有更改结构字段字节顺序的布局说明符,它是平台的 属性。有一些选项可以处理大端文件:
- 如果您可以更改文件格式,那将是一个简单的解决方案。这将使加载和保存文件更容易。
- 读取结构及其字段 "the wrong way around",然后遍历所有字段并使用一些位操作翻转它们,like this。不小心把字段弄错顺序是比较容易的。
- 放弃直接阅读简单的方法,而是一个一个地阅读字段,每个字段都采用大端字节序,例如使用 these options 之一。