代码之家  ›  专栏  ›  技术社区  ›  mycroes

为内存获取可变结构的正确方法?

  •  3
  • mycroes  · 技术社区  · 7 年前

    对于网络协议实现,我想利用 Memory Span 类来实现缓冲区的零拷贝,同时通过 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 是唯一的方法(禁止任何需要 unsafe 关键字)执行此操作。我尝试了一些其他的方法,但我都不知道如何将它们与 ref struct (不能用作泛型类型参数)或如何获取实际缓冲区中的结构而不是副本(在该结构上所做的任何突变都不会反映在缓冲区中)。

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Marc Gravell    7 年前

    OOF。看起来像 MemoryMarshal.Cast 是什么曾经是 NonPortableCast 扩展方法(从: this commit ,在这种情况下-是的,这是在跨距布局之间发出雷鸣声的适当方式,最常见(但不是唯一)的方式,如本例中-介于 byte 还有一些 struct .