2

我目前正在研究霍夫曼解码。我有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]);
            }

PS 部分部分是从网上截取的,不是很懂(如target |= 1<< bitCount

4

2 回答 2

1

听起来您还没有尝试进行霍夫曼编码,只需将“二进制”String0转换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”=> 209)。

方法很简单:

  1. 从...开始result = 0
  2. 对于输入字符串中的每个字符,result向左移动 1 位以为当前字符表示的位“腾出空间”。之后,1如果当前字符代表1位,则添加到结果中。

此外,该代码假定您没有获得超过 64 位的位串,您可能需要检查其稳健性。

于 2013-04-29T02:48:11.230 回答
1

我会以不同的方式做

    byte[] bytes = new BigInteger("1101000100000001", 2).toByteArray();
    for (byte b : bytes) {
         compressedFile.write(b);
    }
于 2013-04-29T03:03:08.750 回答