public static byte[] Decompress(Stream stream) { using (var br = new BinaryReader(stream, Encoding.Default, true)) { int sizeAndMethod = br.ReadInt32(); int size = sizeAndMethod / 8; var method = (Method)(sizeAndMethod % 8); switch (method) { case Method.NoCompression: return(br.ReadBytes(size)); case Method.LZ10: return(LZ10.Decompress(br.BaseStream, size)); case Method.Huffman4Bit: case Method.Huffman8Bit: int num_bits = method == Method.Huffman4Bit ? 4 : 8; return(Huffman.Decompress(br.BaseStream, num_bits, size, ByteOrder.LittleEndian)); case Method.RLE: return(RLE.Decompress(br.BaseStream, size)); default: throw new NotSupportedException($"Unknown compression method {method}"); } } }
public static byte[] Decompress(Stream input) { using (var br = new BinaryReaderX(input, true)) { var methodSize = br.ReadUInt32(); var method = (Method)(methodSize & 0xff); int size = (int)((methodSize & 0xffffff00) >> 8); using (var brB = new BinaryReaderX(new MemoryStream(br.ReadBytes((int)input.Length - 4)))) switch (method) { case Method.LZ10: return(LZ10.Decompress(brB.BaseStream, size)); case Method.LZ11: return(LZ11.Decompress(brB.BaseStream, size)); case Method.Huff4: return(Huffman.Decompress(brB.BaseStream, 4, size, ByteOrder.BigEndian)); case Method.Huff8: return(Huffman.Decompress(brB.BaseStream, 8, size)); case Method.RLE: return(RLE.Decompress(brB.BaseStream, size)); case Method.LZ40: return(LZ40.Decompress(brB.BaseStream, size)); case Method.LZ60: //yes, LZ60 does indeed seem to be the exact same as LZ40 return(LZ40.Decompress(brB.BaseStream, size)); default: br.BaseStream.Position -= 4; return(br.BaseStream.StructToBytes()); } } }
public static byte[] Decompress(Stream input) { using (var br = new BinaryReaderX(input, true)) { var methodSize = br.ReadUInt32(); var method = (Method)(methodSize & 0xff); int size = (int)((methodSize & 0xffffff00) >> 8); using (var brB = new BinaryReaderX(new MemoryStream(br.ReadBytes((int)input.Length - 4)))) switch (method) { case Method.LZ10: return(LZ10.Decompress(brB.BaseStream, size)); case Method.LZ11: return(LZ11.Decompress(brB.BaseStream, size)); case Method.Huff4: return(Huffman.Decompress(brB.BaseStream, 4, size, ByteOrder.BigEndian)); case Method.Huff8: return(Huffman.Decompress(brB.BaseStream, 8, size)); case Method.RLE: return(RLE.Decompress(brB.BaseStream, size)); case Method.LZ60: throw new Exception("LZ60 isn't implemented yet"); //return LZ60.Decompress(brB.BaseStream); default: br.BaseStream.Position -= 4; return(br.BaseStream.StructToBytes()); } } }