private static void BlockDecompress(Stream stream, byte[] outData) { while (stream.Position < stream.Length) { var header = BinaryHelpers.ReadStruct <CIPHeader>(stream); if (header.Magic != 0x55441122) { throw new InvalidDataException($"Invalid magic! Expected 0x55441122, got 0x{header.Magic:X8}"); } var data = new byte[header.CSize - 24]; var decompressed = new byte[header.USize]; if (stream.Read(data, 0, data.Length) != data.Length) { throw new InvalidDataException($"Failed to read {data.Length} bytes from stream"); } Compression.Decompress(data, decompressed); Array.ConstrainedCopy( decompressed, 0, outData, header.UPos, decompressed.Length); } }
/// <summary> /// Reads a compressed-in-place file. This involves reading a header and then /// proceeding to a shared routine for decompression. /// </summary> /// <param name="stream"></param> /// <returns></returns> public static byte[] ReadBlockFile(Stream stream) { var br = new BinaryReader(stream); var fileHeader = BinaryHelpers.ReadStruct <CIPFileHeader>(br); if (fileHeader.Magic != 0x66113388) { throw new InvalidDataException("Invalid header"); } var data = new byte[fileHeader.USize]; BlockDecompress(stream, data); return(data); }