Exemple #1
0
        public void HuffmanCompression()
        {
            var compressor = new HuffmanCompressionProcessor();

            const string input = "cabacabaababbababcacacacaedfghijklmnopqrstuvwxyz"
                                 + "Adsasd131221453!~[]{}{}~~`\'\\!@#$%^&*()_+=90klasdmnvzxcciuhakdkasdfioads"
                                 + "ADBSADLGUCJNZCXNJSLKDGYSADHIASDMNKJLDBOCXBVCXJIMSAD<NSKLDBHCBIUXHCXZNCMSN"
                                 + ",<>?|";

            var inputBytes = Encoding.UTF8.GetBytes(input);

            var now = DateTime.Now.Millisecond;

            var compressed   = compressor.Compress(inputBytes);
            var decompressed = compressor.Decompress(compressed);

            var newNow = DateTime.Now.Millisecond;

            var output = Encoding.UTF8.GetString(decompressed);

            Assert.Equal(input, output);

            Console.WriteLine("Compress/decompress time: " + (newNow - now));
            Console.WriteLine("Input length: " + input.Length);
        }
Exemple #2
0
        private string DecodeString(byte[] bytes, byte prefix)
        {
            int maxPrefixVal = (1 << prefix) - 1;

            // Get first bit. If true => huffman used
            bool isHuffman = (bytes[_currentOffset] & 0x80) != 0;

            int len;

            // throw away huffman's mask
            bytes[_currentOffset] &= 0x7f;

            if ((bytes[_currentOffset]) < maxPrefixVal)
            {
                len = bytes[_currentOffset++];
            }
            else
            {
                int i = 1;
                while (true)
                {
                    if ((bytes[_currentOffset + i] & 0x80) == 0)
                    {
                        break;
                    }
                    i++;
                }

                var numberBytes = new byte[++i];
                Buffer.BlockCopy(bytes, _currentOffset, numberBytes, 0, i);
                _currentOffset += i;

                len = Int32Extensions.FromUVarInt(numberBytes);
            }

            string result = String.Empty;

            if (isHuffman)
            {
                var compressedBytes = new byte[len];
                Buffer.BlockCopy(bytes, _currentOffset, compressedBytes, 0, len);
                var decodedBytes = _huffmanProc.Decompress(compressedBytes);
                result = Encoding.UTF8.GetString(decodedBytes);

                _currentOffset += len;

                return(result);
            }

            result          = Encoding.UTF8.GetString(bytes, _currentOffset, len);
            _currentOffset += len;

            return(result);
        }