/// <summary> /// Initializes a new instance of the <see cref="ParFile"/> class. /// </summary> /// <param name="stream">Binary stream.</param> public ParFile(System.IO.Stream stream) : base(stream, 0, stream.Length) { FileInfo = new ParFileInfo { Flags = 0x00000000, OriginalSize = (uint)stream.Length, CompressedSize = (uint)stream.Length, DataOffset = 0, RawAttributes = 0, ExtendedOffset = 0, Timestamp = 0, }; }
/// <summary> /// Decompress a SLLZ zlib compressed BinaryFormat. /// </summary> /// <param name="source">Compressed format.</param> /// <returns>The decompressed binary.</returns> public ParFile Convert(ParFile source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } var reader = new DataReader(source.Stream) { DefaultEncoding = Encoding.ASCII, }; _ = source.Stream.Seek(4, SeekOrigin.Begin); byte endianness = reader.ReadByte(); reader.Endianness = endianness == 0 ? EndiannessMode.LittleEndian : EndiannessMode.BigEndian; source.Stream.Position = 0; // Read the file header var header = reader.Read <SllzHeader>() as SllzHeader; CheckHeader(header); _ = reader.Stream.Seek(header.HeaderSize, SeekOrigin.Begin); byte[] compressedData = reader.ReadBytes((int)(header.CompressedSize - header.HeaderSize)); byte[] decompressedData = Decompress(compressedData, header.OriginalSize); DataStream newStream = DataStreamFactory.FromArray( decompressedData, 0, (int)header.OriginalSize); var fileInfo = new ParFileInfo { Flags = 0x00000000, OriginalSize = (uint)newStream.Length, CompressedSize = (uint)newStream.Length, DataOffset = source.FileInfo.DataOffset, RawAttributes = source.FileInfo.RawAttributes, ExtendedOffset = source.FileInfo.ExtendedOffset, Timestamp = source.FileInfo.Timestamp, }; return(new ParFile(fileInfo, newStream)); }
/// <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)); }
/// <summary> /// Initializes a new instance of the <see cref="ParFile"/> class. /// </summary> /// <param name="fileInfo">File parameters.</param> /// <param name="stream">Binary stream.</param> public ParFile(ParFileInfo fileInfo, System.IO.Stream stream) : base(stream, 0, stream.Length) { FileInfo = fileInfo; }