为 Memory<byte> / Span<byte> 获取可变结构的正确方法?

myc*_*oes 5 c# struct system.memory

对于网络协议实现,我想利用 newMemorySpanclasses 在通过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;
}
Run Code Online (Sandbox Code Playgroud)

结果是buffer充满了7, 6, 5, 4, 3, 2, 1,这是所期望的,但我很难想象这MemoryMarshal.Cast是唯一的方法(禁止任何需要unsafe关键字的东西)来做到这一点。我尝试了一些其他方法,但我无法弄清楚如何将它们与 a ref struct(不能用作泛型类型参数)或如何获取实际缓冲区中的结构而不是副本(在其上所做的任何突变都不会反映在缓冲区中)。

有没有更简单的方法可以从缓冲区中获取这个可变结构?

Mar*_*ell 5

钱币。看起来MemoryMarshal.Cast是过去的NonPortableCast扩展方法(来自:此提交),在这种情况下 - 是的,这是在跨度布局之间进行 thunk 的适当方法,最常见(但不是唯一的)就像在这种情况下 - 在byte和一些之间struct.