public void CompressFiles()
        {
            var files = Directory.EnumerateFiles(@"..\..\..\Data");

            foreach (var f in files)
            {
                var source           = File.ReadAllBytes(f);
                var compressedData   = Snappy.Compress(source);
                var decompressedData = Snappy.Decompress(compressedData, 0, compressedData.Length);
                Assert.True(decompressedData.SequenceEqual(source));
            }
        }
        /// <summary>
        /// 打包
        /// </summary>
        /// <param name="packet">输入的协议对象</param>
        /// <returns>需要发送的字节流</returns>
        public ArraySegment <byte> Pack(object packet)
        {
            //            offset
            // ---------------------------------------------------------
            // |    包头    |              包体(Count)               |
            // ---------------------------------------------------------
            // |              ArraySegment(包头+包体)                  |
            // ---------------------------------------------------------
            // 返回的ArraySegment,Offset为包头偏移位置,Count为包体长度

            var msgInfo = msgDefined.GetMsgByName(packet.GetType().FullName);

            if (msgInfo == null)
            {
                throw new NotSupportedException("Can not find msg info , msg name is [" + packet.GetType().FullName + "]");
            }

            var sent = new ArraySegment <byte>(sentBuffer, Header.HeadSize, sentBuffer.Length - Header.HeadSize);

            packerPolicy.Packed(ref sent, msgInfo, packet);

            var header = new Header
            {
                MsgId = msgInfo.Id,
            };

            header.FillMsgId(sent);
            var datalen  = sent.Count;
            var destbuff = sentBuffer;

            header.Encrypt = true;
            if (datalen >= 100)
            {
                //compress
                header.Compress = true;
                destbuff        = compSentBuffer;
                datalen         = Snappy.Compress(sent.Array, sent.Offset - 2, sent.Count + 2, compSentBuffer, Header.HeadSize - 2);
                //Debug.LogError("send data compressed pre count->" + sent.Count + " after->" + datalen);
                header.BodyLength = datalen;
            }
            else
            {
                header.BodyLength = datalen + 2;
            }

            sent = new ArraySegment <byte>(destbuff, 0, header.BodyLength + Header.HeadSize - 2);
            header.Fill(sent);
            XorEncrypt.Encrypt(destbuff, Header.HeadSize - 2, header.BodyLength);

            return(sent);
        }
        public void CompressRandomData()
        {
            var r   = new Random();
            var rng = new RNGCryptoServiceProvider();

            for (int i = 0; i < 10000; i++)
            {
                var data = new byte[r.Next(UInt16.MaxValue)];
                rng.GetNonZeroBytes(data);
                var compressedData   = Snappy.Compress(data);
                var decompressedData = Snappy.Decompress(compressedData, 0, compressedData.Length);
                Assert.True(decompressedData.SequenceEqual(data));
            }
        }
        public void LoadToMemory()
        {
            using var resource =
                      typeof(DecompressAlice).Assembly.GetManifestResourceStream("Snappier.Benchmarks.TestData.alice29.txt");

            var input = new byte[65536]; // Just test the first 64KB

            // ReSharper disable once PossibleNullReferenceException
            resource.Read(input);

            var compressed       = new byte[Snappy.GetMaxCompressedLength(input.Length)];
            var compressedLength = Snappy.Compress(input, compressed);

            _input = compressed.AsMemory(0, compressedLength);
        }
Exemple #5
0
        public void BadData_InsufficentOutputBuffer_ThrowsArgumentException()
        {
            var input = new byte[100000];

            Array.Fill(input, (byte)'A');

            var compressed       = new byte[Snappy.GetMaxCompressedLength(input.Length)];
            var compressedLength = Snappy.Compress(input, compressed);

            Assert.Throws <ArgumentException>(() =>
            {
                var output = new byte[100];
                Snappy.Decompress(compressed.AsSpan(0, compressedLength), output);
            });
        }
Exemple #6
0
        public void BadData_LongLength_ThrowsInvalidDataException()
        {
            var input = new byte[1000];

            Array.Fill(input, (byte)'A');

            var compressed       = new byte[Snappy.GetMaxCompressedLength(input.Length)];
            var compressedLength = Snappy.Compress(input, compressed);
            var compressedSpan   = compressed.AsSpan(0, compressedLength);

            // Set the length header to 16383
            compressedSpan[0] = 255;
            compressedSpan[1] = 127;

            Assert.Throws <InvalidDataException>(() =>
            {
                var output = new byte[1000];
                Snappy.Decompress(compressed, output);
            });
        }
Exemple #7
0
        public void BadData_SimpleCorruption_ThrowsInvalidDataException()
        {
            var input = Encoding.UTF8.GetBytes("making sure we don't crash with corrupted input");

            var compressed       = new byte[Snappy.GetMaxCompressedLength(input.Length)];
            var compressedLength = Snappy.Compress(input, compressed);
            var compressedSpan   = compressed.AsSpan(0, compressedLength);

            // corrupt the data a bit
            compressedSpan[1]--;
            compressedSpan[3]++;

            Assert.Throws <InvalidDataException>(() =>
            {
                var length = Snappy.GetUncompressedLength(compressed.AsSpan(0, compressedLength));
                Assert.InRange(length, 0, 1 << 20);

                var output = new byte[length];
                Snappy.Decompress(compressed.AsSpan(0, compressedLength), output);
            });
        }
Exemple #8
0
        public void CompressAndDecompressFile(string filename)
        {
            using var resource =
                      typeof(SnappyTests).Assembly.GetManifestResourceStream($"Snappier.Tests.TestData.{filename}");
            Assert.NotNull(resource);

            var input = new byte[resource.Length];

            resource.Read(input);

            var compressed       = new byte[Snappy.GetMaxCompressedLength(input.Length)];
            var compressedLength = Snappy.Compress(input, compressed);

            var compressedSpan = compressed.AsSpan(0, compressedLength);

            var output       = new byte[Snappy.GetUncompressedLength(compressedSpan)];
            var outputLength = Snappy.Decompress(compressedSpan, output);

            Assert.Equal(input.Length, outputLength);
            Assert.Equal(input, output);
        }