in src/RecyclableMemoryStream.cs [1474:1507]
private int InternalRead(Span<byte> buffer, long fromPosition)
{
if (this.length - fromPosition <= 0)
{
return 0;
}
int amountToCopy;
if (this.largeBuffer == null)
{
var blockAndOffset = this.GetBlockAndRelativeOffset(fromPosition);
int bytesWritten = 0;
int bytesRemaining = (int)Math.Min(buffer.Length, this.length - fromPosition);
while (bytesRemaining > 0)
{
amountToCopy = Math.Min(this.blocks[blockAndOffset.Block].Length - blockAndOffset.Offset,
bytesRemaining);
this.blocks[blockAndOffset.Block].AsSpan(blockAndOffset.Offset, amountToCopy)
.CopyTo(buffer.Slice(bytesWritten));
bytesWritten += amountToCopy;
bytesRemaining -= amountToCopy;
++blockAndOffset.Block;
blockAndOffset.Offset = 0;
}
return bytesWritten;
}
amountToCopy = (int)Math.Min((long)buffer.Length, this.length - fromPosition);
this.largeBuffer.AsSpan((int)fromPosition, amountToCopy).CopyTo(buffer);
return amountToCopy;
}