/// <summary>Created compression stream on top of inner stream.</summary> /// <param name="stream">Inner stream.</param> /// <param name="settings">Compression settings.</param> /// <param name="leaveOpen">Leave inner stream open after disposing.</param> /// <returns>Compression stream.</returns> public static LZ4EncoderStream Encode( Stream stream, LZ4EncoderSettings settings = null, bool leaveOpen = false) { settings ??= LZ4EncoderSettings.Default; var frameInfo = new LZ4Descriptor( settings.ContentLength, settings.ContentChecksum, settings.ChainBlocks, settings.BlockChecksum, settings.Dictionary, settings.BlockSize); var level = settings.CompressionLevel; var extraMemory = settings.ExtraMemory; return(new LZ4EncoderStream( stream, frameInfo, i => LZ4Encoder.Create( i.Chaining, level, i.BlockSize, ExtraBlocks(i.BlockSize, extraMemory)), leaveOpen)); }
private /*async*/ bool ReadFrame(Token token) { Stash.Clear(); var magic = /*await*/ TryPeek4(token); if (!magic.HasValue) { return(false); } if (magic != 0x184D2204) { throw MagicNumberExpected(); } var headerOffset = Stash.Length; var FLG_BD = /*await*/ Peek2(token); var FLG = FLG_BD & 0xFF; var BD = (FLG_BD >> 8) & 0xFF; var version = (FLG >> 6) & 0x11; if (version != 1) { throw UnknownFrameVersion(version); } var blockChaining = ((FLG >> 5) & 0x01) == 0; var blockChecksum = ((FLG >> 4) & 0x01) != 0; var hasContentSize = ((FLG >> 3) & 0x01) != 0; var contentChecksum = ((FLG >> 2) & 0x01) != 0; var hasDictionary = (FLG & 0x01) != 0; var blockSizeCode = (BD >> 4) & 0x07; var contentLength = hasContentSize ? (long?)/*await*/ Peek8(token) : null; var dictionaryId = hasDictionary ? (uint?)/*await*/ Peek4(token) : null; var actualHC = (byte)(DigestOfStash(headerOffset) >> 8); var expectedHC = /*await*/ Peek1(token); if (actualHC != expectedHC) { throw InvalidHeaderChecksum(); } var blockSize = MaxBlockSize(blockSizeCode); if (hasDictionary) { throw NotImplemented( "Predefined dictionaries feature is not implemented"); // Peek4(dictionaryId); } // ReSharper disable once ExpressionIsAlwaysNull _frameInfo = new LZ4Descriptor( contentLength, contentChecksum, blockChaining, blockChecksum, dictionaryId, blockSize); _decoder = _decoderFactory(_frameInfo); _buffer = new byte[blockSize]; return(true); }