如何将Memory <byte>复制到byte []中的特定偏移量

时间:2019-11-08 21:14:16

标签: c#

我正在使用异步网络IO,我的读取缓冲区位于内存中,我试图将内存复制到字节[] 特定的偏移量。

public bool Append(Memory<byte> buffer)
{
    // Verify input data
    if (buffer.Length <= 0 ||
        buffer.Length > PacketSize - Received)
    {
        // Debug.Assert(false);
        return false;
    }

    // Copy received data into packet at current offset
    // TODO : Avoid heap array allocation or iteration
    //Buffer.BlockCopy(buffer.ToArray(), 0, Packet, Received, buffer.Length);
    //private readonly byte[] Packet;
    for (int i = 0; i < buffer.Length; i ++)
    {
        Packet[Received + i] = buffer.Span[i];
    }
    Received += buffer.Length;

    // If we have a header it must match
    if (HasHeader() && !DoesHeaderMatch())
    {
        // Debug.Assert(false);
        return false;
    }

    return true;
}

我正在寻找等价于 Buffer.BlockCopy() ,但内存源的类型应为 Memory<> 或派生的 {{ 1}} 类型。 我不想创建临时堆栈或堆缓冲区。

有什么想法吗?

解决方案:

Span<>

1 个答案:

答案 0 :(得分:2)

希望我能明白你的意思。

因此,您有一个缓冲区Packet,很高兴将其设置为跨度。并且其中包含一些数据,例如Hello World:

byte[] buf = Encoding.ASCII.GetBytes("Hello World");

var bufSpan = buf.AsSpan();

还有其他一些数据作为另一个跨度:

byte[] otherSpan = Encoding.ASCII.GetBytes("rr").AsSpan();

您想将该数据写入缓冲区的某个位置。您必须先对缓冲区进行切片,然后将新数据复制到切片创建的跨度中

otherSpan.CopyTo(bufSpan.Slice(2)); //replace the ll with rr 

Console.WriteLine(Encoding.ASCII.GetString(bufSpan.ToArray()));打印“英雄世界”