【问题标题】:Reading file into struct with types bigger then byte将文件读入类型大于字节的结构
【发布时间】:2025-12-16 19:35:01
【问题描述】:

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

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]定义的

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

谢谢!

【问题讨论】:

    标签: c# byte endianness


    【解决方案1】:

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

    • 如果您可以更改文件格式,那将是一个简单的解决方案。这样可以更轻松地加载和保存文件。
    • 以“错误的方式”读取结构及其字段,然后检查所有字段并使用例如一些位操作like this 翻转它们。不小心按错误的顺序留下字段是相对容易的。
    • 放弃使用直接副本读取简单方法,而是逐个读取字段,例如使用 these options 之一以大端格式读取字段。

    【讨论】:

    • 谢谢!我会认为哪种方式最适合我