像在C中一样在C#中使用struct - 你能吗?

时间:2011-09-04 20:34:36

标签: c# c binaryfiles struct

我正在读取特定格式的二进制文件,并且习惯于能够将一个数据块转换为结构,然后读取结构以从二进制数据文件中提取字段。

我试图这样做但是在C#中失败,它们看起来更像是C语言中的类而不是结构。有可能做我想要的吗?例如..

public struct Datum {
    byte type;
    ushort payload;
}

public struct DiskPage {
    ushort pageNumber;
    Datum[] data = Datum[170];
}

我希望能够读取512个字节的文件并将其转换为DiskPage,然后才能从DiskPage结构中读取值。这可能在c#中 - 还是有另一种首选方法?我应该将该代码保留在C中并将其链接进去吗?

谢谢! 礼

3 个答案:

答案 0 :(得分:4)

默认情况下,编译器不会考虑字段的排序(也可能会移动字段并在内存中留下空白= Packing)。通过使用StructLayout,您可以强制执行不同的行为(默认,顺序或显式)。

对字段上的特定选项使用MarshalAs。小心结束。

[StructLayout(LayoutKind.Explicit, Size=16, CharSet=CharSet.Ansi)]
public struct MySystemTime 
{
   [FieldOffset(0)]public ushort wYear; 
   [FieldOffset(2)]public ushort wMonth;
   [FieldOffset(4)]public ushort wDayOfWeek; 
   [FieldOffset(6)]public ushort wDay; 
   [FieldOffset(8)]public ushort wHour; 
   [FieldOffset(10)]public ushort wMinute; 
   [FieldOffset(12)]public ushort wSecond; 
   [FieldOffset(14)]public ushort wMilliseconds; 
}

答案 1 :(得分:3)

我建议您阅读Mastering C# structs,其中讨论了为此目的使用编组(特别是Marshal.Copy)。

答案 2 :(得分:0)

如果在启用“不安全”选项的情况下进行编译,则可以在C#中使用固定数组。 你也可以使用指针。

internal unsafe struct MyStruct
{
    public fixed byte MyFixedArray[128];
    public byte* MyPointer;
}

最好使用编组,字段偏移并避免不安全的代码。 如果你真的需要代码的一小部分,请使用不安全的代码。 如果可以避免,请不要向外部世界公开固定数组或指针(接口或公共类\结构)。