我目前正在研究霍夫曼解码。我有一个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]);
}
附注有些部分是我从网上抄来的,所以不太理解(如 target |= 1<< bitCount
)
最佳答案
听起来您还没有尝试进行霍夫曼编码,只需将 0
或 1
的“二进制”String
转换为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 个 block (除非这是家庭作业,并且是作业的一部分)。特别是,它正确处理了您给出的示例(“11010001”=> 209)。
方法非常简单:
- 从
结果= 0
开始 - 对于输入字符串中的每个字符,将
结果
向左移动 1 位,以便为当前字符表示的位“腾出空间”。然后,如果当前字符代表1
位,则在结果中添加1
。
此外,代码假设您获得的位字符串不超过 64 位,您可能需要检查其稳健性。
关于java - 将 1's and 0' 的序列拆分为字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16270388/