コード例 #1
0
        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})");
            }
        }
コード例 #2
0
        /// <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));
        }