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); }
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); }
public DataWriter(DataStream stream, EndiannessMode endiannes, Encoding encoding) { this.Stream = stream; this.Endiannes = endiannes; this.Encoding = encoding; }
/// <summary> /// Converter initializer. /// </summary> /// <param name="parameters">Endianness.</param> public void Initialize(EndiannessMode parameters) => _endianness = parameters;
public DataReader(DataStream stream, EndiannessMode endiannes, Encoding encoding) { this.Stream = stream; this.Endiannes = endiannes; this.Encoding = encoding; }