我最近在学习霍夫曼树和Java代码。当我试图编码字符串二进制时,有一个严重的问题。我将一步一步地解释。
1,这些是我要编码的原始单词:
String words = "aa bbb cccc";
字符串
2,图中的霍夫曼代码,它们并不是真实的代码。我正在尝试做一些代码,以便我可以尽快向你展示问题;
a:1110 0110 (ignore the space, I deliberately added it for human readability)
b:0001 1001
c:011
型
3、我把二进制字符串转换成字节数组。
byte[] arr = {-20,31,3}
型
4,解码。我用256(1,1111,1111)对每个字节进行按位或运算,以得到0。然后我使用子串(..)。
for(int i = 0; i < bytes.length; i++) {
boolean isLast = i == bytes.length - 1;
String byteToString = byteToString(isLast, bytes[i]);
System.out.println(byteToString + " ");
}
public static String byteToString(boolean isLast,byte b) {
int temp = b;
if(!isLast) {
temp = 256 | temp; //temp = 256 | -20;(256 | 31)
}
String stringDecode = Integer.toBinaryString(temp);
if(!isLast){
return stringDecode.substring(stringDecode.length() - 8);
} else {
return stringDecode;
}
}
结果:
11101100
00011111
11 // the 0 is missing.
型
我特灵着做“温度= 256| 3”,但我得到了“00000011”。它有太多的0。我不知道我是否表达清楚。如果有人能帮我一个忙,我将非常感激。谢谢。
==编辑
1,要编码的字符串String sentence =“aboutbb c dddd hhhhhhh jjk”; //contentBytes.length():29 byte[] contentsentence = sentence. getsentence();
2、ANSCII与人物出现的时代
第一个月
3、霍夫曼树x1c 0d1x
4、然后是霍夫曼码
32:00
九十七:一一一
九十八点零一分
99:01101
一百比一百一十
一百零四:十
106:0111
107:01100
5、将句子中所有的霍夫曼码编码为一个String数据。
111111111111000100100001101001101101101100010101010101010000111011101100
型
6,按8位或字符拆分
11111111, 11110001, 00100001, 10100110, 11011011, 00010101, 01010101, 00001110, 11101100
型
7、将每个String转换为一个字节类型//length:9 < 29(内容长度)编码字节:[-1,-15,33,-90,-37,21,85,14,-20] 8、解码
int codeInt = 256 | -1; //and so on
String stringDecode = Integer.toBinaryString(temp);
stringDecode.substring(stringDecode.length() - 8);
型
9、如果第6步中的最后8个字符以“0”开头,我就有了前面提到的问题。
我希望我能解释清楚这个问题。我希望如此。如果有人感兴趣,请访问我在github上的代码。Huffuman Code
谢谢大家
1条答案
按热度按时间jtoj6r0c1#
您甚至没有正确地考虑霍夫曼代码,因此您的Java代码和您的问题是无关紧要的。
每个代码都有一个 number of bits,然后是那些bits。这意味着你把
c
显示为有三个位。你需要把这些位作为 that number of bits 放入你的输出流中,以实现压缩。你把一个代码每个编码成一个字节是没有意义的,特别是如果你碰巧最终得到的代码长度超过8位。这可以通过移位和或位操作来完成。你将一个位流构建成一个字,当你的字缓冲区中至少有8位时,你就写出这一个字节。最后,你写出最后一个字节中的任何剩余位。
然后在另一端,您读入字节,用移位和或在一个字中建立一个比特流,然后从流中取出比特,根据需要使用移位和与操作来解码霍夫曼代码。