private long ReadBlocksInfoAndDirectory(EndianBinaryReader varReader) { byte[] blocksInfoBytes; if (HeaderInfo.version >= 7) { varReader.AlignStream(16); } if ((HeaderInfo.flags & (int)ArchiveFlags.kArchiveBlocksInfoAtTheEnd) != 0) { var tempPosition = varReader.Position; { varReader.Position = varReader.BaseStream.Length - HeaderInfo.compressedBlocksInfoSize; blocksInfoBytes = varReader.ReadBytes((int)HeaderInfo.compressedBlocksInfoSize); } varReader.Position = tempPosition; } else //0x40 kArchiveBlocksAndDirectoryInfoCombined { blocksInfoBytes = varReader.ReadBytes((int)HeaderInfo.compressedBlocksInfoSize); } var blocksInfoCompressedStream = new MemoryStream(blocksInfoBytes); MemoryStream blocksInfoUncompresseddStream; switch (HeaderInfo.GetBlocksInfoCompressionType()) { default: //None { blocksInfoUncompresseddStream = blocksInfoCompressedStream; break; } case Compression.CompressionType.kCompressionLzma: { blocksInfoUncompresseddStream = new MemoryStream((int)(HeaderInfo.uncompressedBlocksInfoSize)); SevenZipHelper.StreamDecompress(blocksInfoCompressedStream, blocksInfoUncompresseddStream, HeaderInfo.compressedBlocksInfoSize, HeaderInfo.uncompressedBlocksInfoSize); blocksInfoUncompresseddStream.Position = 0; blocksInfoCompressedStream.Close(); break; } case Compression.CompressionType.kCompressionLz4: case Compression.CompressionType.kCompressionLz4HC: { var uncompressedBytes = new byte[HeaderInfo.uncompressedBlocksInfoSize]; using (var decoder = new Lz4DecoderStream(blocksInfoCompressedStream)) { decoder.Read(uncompressedBytes, 0, uncompressedBytes.Length); } blocksInfoUncompresseddStream = new MemoryStream(uncompressedBytes); break; } } using (var blocksInfoReader = new EndianBinaryReader(blocksInfoUncompresseddStream)) { var uncompressedDataHash = blocksInfoReader.ReadBytes(16); var blocksInfoCount = blocksInfoReader.ReadInt32(); BlocksInfo = new List <StorageBlock>(blocksInfoCount); for (int i = 0; i < blocksInfoCount; i++) { var tempBlock = new StorageBlock().Parse(blocksInfoReader); BlocksInfo.Add(tempBlock); } var nodesCount = blocksInfoReader.ReadInt32(); DirectoryInfo = new List <Node>(nodesCount); for (int i = 0; i < nodesCount; i++) { var tempDirInfo = new Node().Parse(blocksInfoReader); DirectoryInfo.Add(tempDirInfo); } } return(varReader.Position); }