Esempio n. 1
0
 /// <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,
     };
 }
Esempio n. 2
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));
        }
Esempio n. 3
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));
        }
Esempio n. 4
0
 /// <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;
 }