我目前正致力于霍夫曼解码。我有所有字符编码的String
表示(即“1101000100000001”)。我试图将其分成8组并返回其相应的值(即“11010001”将返回209)。但是它似乎不适用于较小的文件。以下是我的代码。提前感谢您的帮助!
for(char bit : textbytes.toCharArray())
{
if(bit == '1')
{
target |= 1 << bitCount;
}
bitCount++;
if(bitCount >= 8)
{
bitCount = 0;
bits.add(target);
target = 0;
}
}
byte[] bitstring = new byte[bits.size()];
for(int i = 0; i < bits.size(); i ++)
{
bitstring[i] = bits.get(i);
compressedFile.write(bitstring[i]);
}
P.S。我从互联网上获取的一些部分,所以我不完全理解它(例如target |= 1<< bitCount
)
答案 0 :(得分:1)
听起来你还没有尝试做霍夫曼编码,只需将String
或0
的“二进制”1
转换成Java整数类型。试试这个:
public static long decode(String textbytes) {
long result=0;
for(char ch : textbytes.toCharArray()) {
result = result << 1;
if(ch == '1')
result = result + 1;
}
return result;
}
此方法将位串解码为Java long
。没有必要担心分成8块(除非这是作业,这是作业的一部分)。特别是,它处理您正确提供的示例(“11010001”=&gt; 209)。
方法非常简单:
result = 0
result
向左移1位,以便为当前字符所代表的位“腾出空间”。然后,如果当前字符代表1
位,则将1
添加到结果中。此外,代码假设您没有比64位更长的位字符串,您可能需要检查其稳健性。
答案 1 :(得分:1)
我会采用不同的方式
byte[] bytes = new BigInteger("1101000100000001", 2).toByteArray();
for (byte b : bytes) {
compressedFile.write(b);
}