private bool LoadBlock() { if (_blocks.Count == 0) { return(false); } if (_currentBlock != null && IsInBlock(_entryPosition, _currentBlock)) { return(true); } CloseBlock(); var index = FindBlock(_blocks, _entryPosition); if (index < 0) { return(false); } var block = _blocks[index]; var blockStream = new MemoryStream((int)block.UncompressedSize); _blockCompressor.ReadBlock(_entryOffset, block, blockStream); _currentBlock = block; _currentBlockStream = blockStream; return(true); }
public void ReadBlock(long entryOffset, ModuleDataBlock block, Stream outStream) { _stream.Position = _dataAreaOffset + entryOffset + block.CompressedOffset; if (block.IsCompressed) { Inflate(_stream, block.CompressedSize, block.UncompressedSize, outStream); } else { StreamUtil.Copy(_stream, outStream, block.UncompressedSize); } }
private static bool IsInBlock(long position, ModuleDataBlock block) { return(position >= block.UncompressedOffset && position < block.UncompressedOffset + block.UncompressedSize); }
private void CloseBlock() { _currentBlockStream?.Dispose(); _currentBlockStream = null; _currentBlock = null; }