Exemple #1
0
        protected static Dictionary <byte[], BitArray> GetCodeBook(IEnumerable <Stream> streams, byte compressLevel)
        {
            var weightDictionary = new Dictionary <byte[], ulong>(new ByteArrayEqualityComparer());

            foreach (var stream in streams)
            {
                // 移动输入流的位置到开头
                stream.Seek(0, SeekOrigin.Begin);
                // 循环读取单位字节数到缓冲数组中,之后进行计数操作
                while (stream.Position < stream.Length)
                {
                    int readByte;
                    // 建立一个具有合适大小的字节缓存数组
                    var buffer = new byte[Math.Min(compressLevel, stream.Length - stream.Position)];
                    for (var i = 0; i < compressLevel && (readByte = stream.ReadByte()) >= 0; i++)
                    {
                        buffer[i] = (byte)readByte;
                    }
                    if (weightDictionary.ContainsKey(buffer))
                    {
                        weightDictionary[buffer]++;
                    }
                    else
                    {
                        weightDictionary[buffer] = 1;
                    }
                }
            }

            // 创建哈夫曼树
            var huffmanTree =
                HuffmanTree <byte[]> .CreateFromWeightDictionary(weightDictionary, new ByteArrayEqualityComparer());

            // 获取编码本
            var codeBook = huffmanTree.CodeBook;

            return(codeBook);
        }