簡體   English   中英

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

[英]How to copy Memory<byte> to a specific offset in byte[]

我正在使用異步網絡 IO,我的讀取緩沖區位於Memory中,我正在嘗試將Memory復制到特定偏移量的字節 []中。

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 源應該是Memory<>類型或派生Span<>類型。 我不想創建臨時堆棧或堆緩沖區。

有任何想法嗎?

解決方案:

// Copy received data into packet at current offset
Span<byte> destination = Packet.AsSpan().Slice(Received, buffer.Length);
Span<byte> source = buffer.Span;
source.CopyTo(destination);
Received += buffer.Length;

希望我能明白你在說什么。。

所以你有一個緩沖區,Packet,你很高興把它變成一個跨度。 它有一些數據,比如 Hello World:

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

var bufSpan = buf.AsSpan();

你還有一些其他數據作為另一個跨度:

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

並且您想將該數據寫入緩沖區的某個位置。 您必須先對緩沖區進行切片並將新數據復制到切片創建的 Span 中

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

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

暫無
暫無

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

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