static MemoryStream UnpackStream(BinaryReader binaryReader, uint blockSize, uint decompressedSize = 0, byte compressionMethod = byte.MaxValue) { if (decompressedSize == 0) { decompressedSize = binaryReader.ReadUInt32(); } if (compressionMethod == byte.MaxValue) { compressionMethod = binaryReader.ReadByte(); } Bio.Debug("Decompressing " + blockSize + " bytes @ " + binaryReader.BaseStream.Position); Bio.Debug(string.Format("\tCompression: {0}, decompressed size: {1}", (COMPRESSION)compressionMethod, decompressedSize)); blockSize -= 5; var decompressedStream = new MemoryStream((int)decompressedSize); switch ((COMPRESSION)compressionMethod) { case COMPRESSION.NONE: binaryReader.BaseStream.Copy(decompressedStream, (int)blockSize); break; case COMPRESSION.DEFLATE: binaryReader.BaseStream.Skip(2); using (var deflateStream = new DeflateStream(binaryReader.BaseStream, CompressionMode.Decompress, true)) { deflateStream.Copy(decompressedStream, (int)decompressedSize); } break; case COMPRESSION.BZ2: using (var bzip2Stream = new BZip2InputStream(binaryReader.BaseStream)) { bzip2Stream.IsStreamOwner = false; bzip2Stream.Copy(decompressedStream, (int)decompressedSize); } break; default: Bio.Warn("Unknown compression method, data might be encrypted and cannot be unpacked. Skipping block."); decompressedStream.Dispose(); binaryReader.BaseStream.Skip(blockSize); return(null); } //binaryReader.BaseStream.Skip(blockSize); return(decompressedStream); }