我正在使用异步网络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<>
答案 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()));
打印“英雄世界”