Ejemplo n.º 1
0
        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);
        }