最近在学习哈夫曼树和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.
我试图做“temp = 256 | 3”,但我得到“00000011”。它有太多0。 我不知道我是否表达清楚了。 如果有人能帮我一个忙,我将非常感激。谢谢你。
您甚至没有正确考虑霍夫曼代码,因此您的Java代码和您的问题无关。
每个代码都有一个位数,然后是这些位。这意味着您应该
c
作为三位。您需要将这些位作为“该位数”放入输出流中,以实现压缩。将一个代码编码为一个字节是没有意义的,特别是如果您最终得到的代码长度超过八位。
这是通过位运算、移位和或正确完成的。您将一串位流构建成一个字,当字缓冲区中至少有八位时,您就写出该一个字节。最后,写出最后一个字节中的所有剩余位。
然后在另一端,您以字节为单位读取,使用移位和或在字中构建位流,然后使用移位和与操作从流中提取位以根据需要解码霍夫曼代码。