簡體   English   中英

獲取Memory的可變結構的正確方法 <byte> / 跨度 <byte> ?

[英]Proper way to get a mutable struct for Memory<byte> / Span<byte>?

對於網絡協議實現,我想利用新的MemorySpan類來實現緩沖區的零拷貝,同時通過struct訪問數據。

我有以下人為的例子:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Data
{
    public int IntValue;
    public short ShortValue;
    public byte ByteValue;
}

static void Prepare()
{
    var buffer = new byte[1024];
    var dSpan = MemoryMarshal.Cast<byte, Data>(buffer);
    ref var d = ref dSpan[0];

    d.ByteValue = 1;
    d.ShortValue = (2 << 8) + 3;
    d.IntValue = (4 << 24) + (5 << 16) + (6 << 8) + 7;
}

其結果是, buffer填充有7, 6, 5, 4, 3, 2, 1被如所期望,但我很難想象MemoryMarshal.Cast是唯一的方法(BAR任何要求unsafe做關鍵詞)這個。 我嘗試了一些其他方法,但我無法弄清楚如何將它們與ref struct (不能用作泛型類型參數)或如何獲取實際緩沖區中的結構而不是副本(任何突變都不會反映在緩沖區中)。

有沒有更簡單的方法從緩沖區獲取這個可變結構?

錢幣。 看起來像MemoryMarshal.Cast曾經是NonPortableCast擴展方法(來自: this commit ),在這種情況下 - 是的,這是在跨度布局之間進行thunk的合適方式,最常見(但不是唯一)就像在這種情況下一樣- 在byte和一些struct之間。

暫無
暫無

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

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