C# 在C中使用struct#就像在C中一样-可以吗?

C# 在C中使用struct#就像在C中一样-可以吗?,c#,c,binaryfiles,struct,C#,C,Binaryfiles,Struct,我正在读取一个特定格式的二进制文件,并且习惯于能够将一个数据块强制转换为一个结构,然后读取该结构以从二进制数据文件中提取字段 我正试图这样做,但在C#中失败了,它们看起来更像是C意义上的类而不是结构。有可能做我想做的吗?例如 public struct Datum { byte type; ushort payload; } public struct DiskPage { ushort pageNumber; Datum[] data = Datum[170]

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

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

public struct Datum {
    byte type;
    ushort payload;
}

public struct DiskPage {
    ushort pageNumber;
    Datum[] data = Datum[170];
}
我希望能够读取512字节的文件并将其转换为DiskPage,然后能够从DiskPage结构中读取值。这在c#中是可能的,还是有另一种首选方法?我应该把代码留在C中,然后链接到C中吗

谢谢!
Reza

我建议您阅读讨论为此目的使用封送处理(
Marshal.Copy
)的文章

默认情况下,编译器不尊重字段的顺序(也可能会移动字段并在内存中留下间隙=)。通过使用,可以强制执行不同的行为(默认、顺序或显式)

用于字段上的特定选项。小心忍耐

[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; 
}

如果启用了不安全选项,则可以在C#中使用固定数组。 您还可以使用指针

internal unsafe struct MyStruct
{
    public fixed byte MyFixedArray[128];
    public byte* MyPointer;
}
最好使用编组、字段偏移和避免不安全代码。 如果您确实需要在代码的一小部分中使用不安全的代码。
如果可以避免的话,不要将固定数组或指针(接口或公共类\structs)暴露给外部世界。

我认为,要完全按照您习惯的方式进行,这需要某种类型的双关,而在C中,这将是不安全的代码。你必须使用指针而不是引用(如果有可能的话)。忘记你对C的了解,学习C#可能的C#方式-可能不是一个好主意。查看Christopher Currens关于StackOverflow问题的回答,了解如何操作:@David:好建议,但仍然有大量的文件和API采用字节/位布局。我已经重新定义了结构和代码,可以在这里访问它:谢谢!这是一个很好的链接,其中的代码也与我在这里找到的代码相同: