繁体   English   中英

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

[英]Using struct in C# as you would in C - can you?

我正在读取特定格式的二进制文件,并且习惯于将数据块转换为结构,然后读取该结构以将字段拉出二进制数据文件。

我正在尝试执行此操作,但是在C#中失败了,它们在C方面看起来更像是类而不是结构。 有可能做我想要的吗? 例如..

public struct Datum {
    byte type;
    ushort payload;
}

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

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

谢谢! 雷扎

编译器默认情况下不遵循字段的顺序(也可能会移动字段并在内存中留下空白= 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; 
}

我建议您阅读精通C#结构 ,该结构讨论了为此目的使用封送处理(特别是Marshal.Copy )。

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

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

最好使用编组,字段偏移并避免使用不安全的代码。 如果您确实需要很少的代码,请使用不安全的代码。 如果可以避免,请勿将固定数组或指针(接口或公共类\\结构)暴露给外部世界。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM