public static byte[] Decompress(byte[] b, bool hasMagic = true) { using (var br = new FileReader(new MemoryStream(b), true)) { if (br.ReadString(4) == "ZCMP") { return(DecompressZCMP(b)); } else { var ms = new System.IO.MemoryStream(); if (hasMagic) { br.Position = 2; using (var ds = new DeflateStream(new MemoryStream(br.ReadBytes((int)br.BaseStream.Length - 6)), CompressionMode.Decompress)) ds.CopyTo(ms); } else { using (var ds = new DeflateStream(new MemoryStream(b), CompressionMode.Decompress)) ds.CopyTo(ms); } return(ms.ToArray()); } } }
public static Byte[] DecompressZCMP(byte[] b) { Console.WriteLine("DecompressZCMP"); using (var br = new FileReader(new MemoryStream(b), true)) { var ms = new System.IO.MemoryStream(); br.BaseStream.Position = 130; using (var ds = new DeflateStream(new MemoryStream(br.ReadBytes((int)br.BaseStream.Length - 80)), CompressionMode.Decompress)) ds.CopyTo(ms); return(ms.ToArray()); } }
public static byte[] ToBytes(this Stream stream) { using (var reader = new FileReader(stream, true)) { return(reader.ReadBytes((int)stream.Length)); } using (var memStream = new MemoryStream()) { stream.CopyTo(memStream); return(memStream.ToArray()); } }
public static Stream Compress(Stream stream, bool isBigEndian = true) { uint decompSize = (uint)stream.Length; uint[] section_sizes; uint sectionCount = 0; var mem = new MemoryStream(); using (var reader = new FileReader(stream, true)) using (var writer = new FileWriter(mem, true)) { writer.SetByteOrder(isBigEndian); if (!(decompSize % 0x10000 != 0)) { sectionCount = decompSize / 0x10000; } else { sectionCount = (decompSize / 0x10000) + 1; } writer.Write(0x10000); writer.Write(sectionCount); writer.Write(decompSize); writer.Write(new uint[sectionCount]); writer.Align(128); reader.SeekBegin(0); section_sizes = new uint[sectionCount]; for (int i = 0; i < sectionCount; i++) { byte[] chunk = ZLIB.Compress(reader.ReadBytes(0x10000)); section_sizes[i] = (uint)chunk.Length; writer.Write(chunk.Length); writer.Write(chunk); writer.Align(128); } writer.SeekBegin(12); for (int i = 0; i < sectionCount; i++) { writer.Write(section_sizes[i] + 4); } } return(mem); }