public void Write(EndianBinaryWriter writer)
        {
            var decMemStream = new MemoryStream();
            var decWriter    = new EndianBinaryWriter(decMemStream);

            decWriter.Write(Literals.Length);
            foreach (var literal in Literals)
            {
                decWriter.SeekNext(4); //uint size
                var oldPos = decWriter.Position;
                BeamTerm.TermToBinary(decWriter, literal);
                var len = (uint)(decWriter.Position - oldPos);
                decWriter.SeekBack((int)(len + 4));
                decWriter.Write(len);
                decWriter.SeekNext((int)len);
            }

            decMemStream.Position = 0;
            var decBytes = decMemStream.ToArray();

            writer.Write(decBytes.Length);
            var encBytes = ZLibCompressor.Compress(decBytes);

            writer.Write(encBytes);
        }
        public void ZLibCompressStreamTest()
        {
            ZLibCompressor target = new ZLibCompressor();

            string originalText = "Test string.";

            MemoryStream msOriginal = new MemoryStream(ASCIIEncoding.ASCII.GetBytes(originalText));

            byte[]       compressbuffer = new byte[2000];
            MemoryStream msCompressed   = new MemoryStream(compressbuffer);

            int outLen = 0;

            ZLibError err = target.Compress(msOriginal, msCompressed, ref outLen, ZLibQuality.Default);

            Assert.AreEqual(ZLibError.Okay, err);

            MemoryStream msToDecompress = new MemoryStream(compressbuffer, 0, outLen);

            byte[]       decompressbuffer = new byte[2000];
            MemoryStream msFinalResult    = new MemoryStream(decompressbuffer);

            err = target.Decompress(msToDecompress, msFinalResult, ref outLen);
            Assert.AreEqual(ZLibError.Okay, err);

            string result = ASCIIEncoding.ASCII.GetString(decompressbuffer, 0, outLen);

            Assert.AreEqual(originalText, result);
        }
Beispiel #3
0
        public void ZLibStream_Compressor_2()
        {
            byte[] input = Encoding.UTF8.GetBytes("ABCDEF");

            // Compress first,
            // 78-9C-73-74-72-76-71-75-03-00-05-7E-01-96
            byte[] compBytes = ZLibCompressor.Compress(input);

            // then Decompress.
            byte[] decompBytes = ZLibCompressor.Decompress(compBytes);

            // Comprare SHA256 Digest
            byte[] inputDigest  = TestSetup.SHA256Digest(input);
            byte[] decompDigest = TestSetup.SHA256Digest(decompBytes);
            Assert.IsTrue(decompDigest.SequenceEqual(inputDigest));
        }
Beispiel #4
0
        /// <summary>
        ///     Compresses the specified input in
        /// </summary>
        public static int CompressInZLibFormat(byte[] input, out byte[] output)
        {
            byte[] compressed         = ZLibCompressor.Compress(input, CompressionLevel.Level1);
            int    compressedLength   = compressed.Length;
            int    uncompressedLength = input.Length;

            output    = new byte[compressedLength + 4];
            output[0] = (byte)uncompressedLength;
            output[1] = (byte)(uncompressedLength >> 8);
            output[2] = (byte)(uncompressedLength >> 16);
            output[3] = (byte)(uncompressedLength >> 24);

            Array.Copy(compressed, 0, output, 4, compressedLength);

            return(output.Length);
        }
Beispiel #5
0
        public void ZLibStream_Compressor_1()
        {
            void Template(string fileName, ZLibCompLevel level)
            {
                string filePath = Path.Combine(TestSetup.SampleDir, fileName);

                using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                    using (MemoryStream compMs = ZLibCompressor.Compress(fs))
                        using (MemoryStream decompMs = ZLibCompressor.Decompress(compMs))
                        {
                            // Compare SHA256 Digest
                            fs.Position = 0;
                            byte[] fileDigest   = TestSetup.SHA256Digest(fs);
                            byte[] decompDigest = TestSetup.SHA256Digest(decompMs);
                            Assert.IsTrue(decompDigest.SequenceEqual(fileDigest));
                        }
            }

            Template("ex1.jpg", ZLibCompLevel.Default);
            Template("ex2.jpg", ZLibCompLevel.BestCompression);
            Template("ex3.jpg", ZLibCompLevel.BestSpeed);
        }
Beispiel #6
0
 /// <summary>Сжимает массив</summary>
 /// <param name="data">Входной массив.</param>
 /// <returns>Сжатый массив</returns>
 public static byte[] Compress(byte[] data)
 {
     return(ZLibCompressor.Compress(data));
 }
Beispiel #7
0
        /// <summary>

        /// 将录制的数据写入wav文件 改写为UDP发送

        /// </summary>

        private void RecordCapturedData(Socket Client, EndPoint epserver)

        {
            byte[] CaptureData = null;

            byte[] SendData = null;

            int ReadPos = 0;

            int CapturePos = 0;

            int LockSize = 0;



            mRecBuffer.GetCurrentPosition(out CapturePos, out ReadPos);

            LockSize = ReadPos - mNextCaptureOffset;

            if (LockSize < 0)
            {
                LockSize += mBufferSize;
            }



            // 对齐缓冲区边界,实际上由于开始设定完整,这个操作是多余的.

            LockSize -= (LockSize % mNotifySize);



            if (0 == LockSize)
            {
                return;
            }



            // 读取缓冲区内的数据

            CaptureData = (byte[])mRecBuffer.Read(mNextCaptureOffset, typeof(byte), LockFlag.None, LockSize);


            // 更新已经录制的数据长度.

            mSampleCount += CaptureData.Length;


            //压缩数据,实测压缩率在50%左右

            SendData = ZLibCompressor.Compress(CaptureData);


            // 写入Wav文件 ,在这里改成发送

//            mWriter.Write(SendData, 0, SendData.Length);

            //           mWriter.Write(CaptureData, 0, CaptureData.Length);


            //发送文件到网络
            try
            {
                Client.SendTo(SendData, epServer);//传送语音
                            
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "错误");
            }



            // 移动录制数据的起始点,通知消息只负责指示产生消息的位置,并不记录上次录制的位置

            mNextCaptureOffset += CaptureData.Length;

            mNextCaptureOffset %= mBufferSize; // Circular buffer
        }