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