簡體   English   中英

我可以得到一個跨度 <byte> 引用非字節類型的結構成員字段?

[英]Can I get a Span<byte> that references a struct member field of non-byte type?

說我有一個類似下面的結構:

struct MyStruct {
  Guid g;
}

是否有可能獲得引用該結構字節的Span<byte>

struct MyStruct {
  Guid g;

  public void Foo() {
    Span<byte> bytes = ???
  }
}

這樣, bytes將是長度為16的Span<byte> ,這將允許直接讀取和寫入Guid字段的各個字節。

我可以對不安全的代碼執行類似的操作,但似乎現在應該可以通過跨度的安全代碼來實現,但是我無法弄清楚如何產生跨度。

編輯:澄清一下,我想要一個跨度指向Guid的實際存儲位置。 意思是new Span<byte>(g.ToByteArray))不是我要的。 這將分配一個新的數組,將字節復制到該數組,並創建一個引用新分配的數組的Span。 通過這樣的跨度修改字節不會修改Guid。

您可以將Guid強制為數組

struct MyStruct {
   public Guid g;
}

...

var s = new MyStruct();
var span = new Span<byte>(s.g.ToByteArray());
span[2] = 4;

注意 :以上內容不會修改原始結構。 但是,正如您指出的那樣,您可以在unsafe執行此操作

var s = new MyStruct();
var span = new Span<byte>(&s , Marshal.SizeOf(s));

// woah it just become mutable 
span[2] = 4;

在.Net Core 2.1或更高版本中嘗試以下操作:

            Span<MyStruct> valSpan = MemoryMarshal.CreateSpan(ref mystruct, 1);
            Span<byte> span = MemoryMarshal.AsBytes(valSpan);

但是請謹慎使用,因為GC可以移動引用類型,所以您的結構中不應包含任何指針或引用類型。 實際上,它將執行運行時檢查,並在執行時引發異常。

查看Span類的構造函數,創建Span的唯一方法是提供托管數組或指針。

但是Guid由1個int,2個短褲和8個字節組成,而不是字節數組。

因此這是不可能的(至少現在不是這樣)。

暫無
暫無

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

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