/// <inheritdoc/> public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0) { IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset); if (length == 0) { return; } var remaining = length; var hintIdx = locateChunk(start); var hint = chunkHints[hintIdx]; // these 2 must be close together, 2GiB chunks are too big int chunkOffset = (int)(start - hint.DataStart); while (remaining > 0) { lock (dataLock) { if (chunkHints.Count <= hintIdx) { hint = hint.ComputeNextHint(this); chunkHints.Add(hint); } else { hint = chunkHints[hintIdx]; } } var seg = new StreamSegment(stream, hint.StreamStart); var read = (int)Math.Min(hint.DataLength - chunkOffset, remaining); seg.ReadBytesToBuffer(buffer, chunkOffset, read, offset); offset += read; remaining -= read; chunkOffset = 0; ++hintIdx; } }