将文件读入类型大于字节的结构

时间:2018-10-31 13:56:46

标签: c# byte endianness

我使用以下代码将文件读入结构:

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

但是我注意到,任何大于byte的变量,例如int32,int16都会向后接收数据。例如,如果文件中的数据为:AA BB CC DD 相应的变量(int32)将为:DD CC BB AA。

我的结构体是用属性[StructLayout(LayoutKind.Sequential), Pack = 1]

定义的

有人知道为什么以及如何解决吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果文件使用big-endian字节顺序会发生这种情况,但是结构的数据成员当然是little-endian,对此您无能为力。没有布局说明符可以更改结构字段的字节序,这是平台的属性。有一些处理大端文件的选项:

  • 如果您可以更改文件格式,那将是一个简单的解决方案。这将使加载和保存文件更加容易。
  • 读取结构及其字段“错误的方式”,然后遍历所有字段并通过例如like this的位操作对其进行翻转。意外地以错误的顺序离开字段相对容易。
  • 放弃阅读简单的直接副本的方法,而是逐个读取字段,例如使用these options中的一个按大端顺序读取每个字段。