Example #1
0
        private static DataStream Inflate(DataStream source, EndiannessMode endianness)
        {
            DataStream dest = DataStreamFactory.FromMemory();

            source.Seek(0);
            var reader = new DataReader(source)
            {
                Endianness = endianness,
            };

            int size      = reader.ReadInt32();
            int chunkSize = reader.ReadInt32();

            while (chunkSize != 0)
            {
                using var zlibStream = new ZlibStream(dest, CompressionMode.Decompress, true);
                source.WriteSegmentTo(source.Position, chunkSize, zlibStream);
                zlibStream.Close();

                source.Seek(chunkSize, SeekOrigin.Current);
                chunkSize = reader.ReadInt32();
            }

            if (dest.Length != size)
            {
                throw new ExtractionException("Result size doesn't match with expected size.");
            }

            return(dest);
        }
Example #2
0
        private static DataStream Deflate(DataStream source, EndiannessMode endianness)
        {
            DataStream dest = DataStreamFactory.FromMemory();

            var writer = new DataWriter(dest)
            {
                Endianness = endianness,
            };

            source.Seek(0);
            writer.Write((int)source.Length);

            int remaining = (int)source.Length;

            while (remaining > 0)
            {
                int chunkSize = Math.Min(remaining, 0x8000);

                long lengthPos = dest.Position;
                writer.Write(0); // size placeholder

                long startDataPos = dest.Position;
                using var zlibStream = new ZlibStream(dest, CompressionMode.Compress, CompressionLevel.BestCompression, true);
                source.WriteSegmentTo(source.Position, chunkSize, zlibStream);
                zlibStream.Close();
                long compressedChunkSize = dest.Position - startDataPos;
                dest.PushToPosition(lengthPos);
                writer.Write((int)compressedChunkSize);
                dest.PopPosition();

                source.Seek(chunkSize, SeekOrigin.Current);
                remaining -= chunkSize;
            }

            writer.Write(0);

            return(dest);
        }
Example #3
0
 public DataWriter(DataStream stream, EndiannessMode endiannes, Encoding encoding)
 {
     this.Stream    = stream;
     this.Endiannes = endiannes;
     this.Encoding  = encoding;
 }
Example #4
0
 /// <summary>
 /// Converter initializer.
 /// </summary>
 /// <param name="parameters">Endianness.</param>
 public void Initialize(EndiannessMode parameters) => _endianness = parameters;
Example #5
0
 public DataReader(DataStream stream, EndiannessMode endiannes, Encoding encoding)
 {
     this.Stream    = stream;
     this.Endiannes = endiannes;
     this.Encoding  = encoding;
 }