private static void CheckHeader(SllzHeader header) { if (header == null) { throw new ArgumentNullException(nameof(header)); } if (header.Magic != "SLLZ") { throw new FormatException($"SLLZ zlib: Bad magic Id ({header.Magic} != SLLZ)"); } if (header.CompressionType != CompressionType.Zlib) { throw new FormatException($"SLLZ zlib: Bad Compression Type ({header.CompressionType})"); } }
/// <summary> /// Creates a SLLZ standard compressed BinaryFormat. /// </summary> /// <param name="source">Original format.</param> /// <returns>The compressed binary.</returns> public ParFile Convert(BinaryFormat source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } source.Stream.Seek(0); byte[] data = new byte[source.Stream.Length]; _ = source.Stream.Read(data, 0, data.Length); byte[] compressedData; try { compressedData = Compress(data); } catch (SllzException) { // Data can't be compressed return(new ParFile(source.Stream)); } DataStream outputDataStream = compressorParameters.OutputStream ?? DataStreamFactory.FromMemory(); outputDataStream.Position = 0; var writer = new DataWriter(outputDataStream) { DefaultEncoding = Encoding.ASCII, Endianness = compressorParameters.Endianness == Endianness.LittleEndian ? EndiannessMode.LittleEndian : EndiannessMode.BigEndian, }; var header = new SllzHeader { Magic = "SLLZ", Endianness = compressorParameters.Endianness, CompressionType = compressorParameters.CompressionType, HeaderSize = 0x10, OriginalSize = (uint)source.Stream.Length, CompressedSize = (uint)compressedData.Length + 0x10, // includes header length }; writer.WriteOfType(header); writer.Write(compressedData); var fileInfo = new ParFileInfo { Flags = 0x80000000, OriginalSize = (uint)source.Stream.Length, CompressedSize = (uint)outputDataStream.Length, DataOffset = 0, RawAttributes = 0, ExtendedOffset = 0, Timestamp = 0, }; return(new ParFile(fileInfo, outputDataStream)); }