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); }
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); }