繁体   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