in src/RecyclableMemoryStream.cs [1439:1472]
private int InternalRead(byte[] buffer, int offset, int count, 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((long)count, this.length - fromPosition);
while (bytesRemaining > 0)
{
amountToCopy = Math.Min(this.blocks[blockAndOffset.Block].Length - blockAndOffset.Offset,
bytesRemaining);
Buffer.BlockCopy(this.blocks[blockAndOffset.Block], blockAndOffset.Offset, buffer,
bytesWritten + offset, amountToCopy);
bytesWritten += amountToCopy;
bytesRemaining -= amountToCopy;
++blockAndOffset.Block;
blockAndOffset.Offset = 0;
}
return bytesWritten;
}
amountToCopy = (int)Math.Min((long)count, this.length - fromPosition);
Buffer.BlockCopy(this.largeBuffer, (int)fromPosition, buffer, offset, amountToCopy);
return amountToCopy;
}