簡體   English   中英

字節數組“聯合”覆蓋在c#StructLayout.Explicit中

[英]Byte Array “Union” overlay in c# StructLayout.Explicit

我希望在ac#struct類型中有一種c風格的uion。

出於某種原因,每次我分配一個我定義的類型時,我都會得到一個異常。 這是我自己的類型。 基本的想法是我可以訪問這個結構的“指針”。 不幸的是我得到了一個Exception TypeLoadException:

附加信息:無法從程序集“ManagedTarget,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”加載類型“ManagedTarget.FngPeriodeParameterType”,因為它包含偏移0處的對象字段,該字段未正確對齊或重疊對象字段。

怎么了?

[StructLayout(LayoutKind.Explicit, Size = 16)]
unsafe internal struct FngPeriodeParameterType
{
  [FieldOffset(0)]
  public Byte[] ByteArray;

  [FieldOffset(0)]
  public UInt32 Repetitions;

  [FieldOffset(4)]
  public Int16 Amplitude;

  [FieldOffset(6)]
  public Int16 Offset;

  [FieldOffset(8)]
  public Int16 Gain;

  [FieldOffset(10)]
  public UInt16 Selection;

  [FieldOffset(12)]
  public UInt32 Step;
}

如果你的意圖是ByteArray是原始數據,它必須是一個fixed緩沖區; 目前,它只是對堆上不相關的 byte[]的引用 - 並且您不能重疊引用和uint

[FieldOffset(0)]
public fixed byte ByteArray[16];

但是,使用它可能會很痛苦; 我通常添加輔助方法,如:

public void ReadBytes(byte[] data)
{
    fixed (byte* ptr = ByteArray)
    {
        for (int i = 0; i < 16; i++)
            data[i] = ptr[i];
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM