Exemple #1
0
        /// <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));
        }
Exemple #2
0
        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);
        }