コード例 #1
0
ファイル: DechunkedStream.cs プロジェクト: schlndh/netool
        /// <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;
            }
        }