将1和0的序列拆分为字节

时间:2013-04-29 02:27:11

标签: java file compression huffman-code

我目前正致力于霍夫曼解码。我有所有字符编码的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

2 个答案:

答案 0 :(得分: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”=&gt; 209)。

方法非常简单:

  1. result = 0
  2. 开始
  3. 对于输入字符串中的每个字符,将result向左移1位,以便为当前字符所代表的位“腾出空间”。然后,如果当前字符代表1位,则将1添加到结果中。
  4. 此外,代码假设您没有比64位更长的位字符串,您可能需要检查其稳健性。

答案 1 :(得分:1)

我会采用不同的方式

    byte[] bytes = new BigInteger("1101000100000001", 2).toByteArray();
    for (byte b : bytes) {
         compressedFile.write(b);
    }