【问题标题】:Splitting sequence of 1's and 0's into byte将 1 和 0 的序列拆分为字节
【发布时间】:2013-04-29 02:27:11
【问题描述】:

我目前正在研究霍夫曼解码。我有一个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&lt;&lt; bitCount

【问题讨论】:

  • 任何特定的语言偏好?
  • 我认为你应该用 0 填充它
  • 嗯,即使有超过 8 个 1 和 0,它似乎也不适用于较小的文件

标签: java file compression huffman-code


【解决方案1】:

听起来您还没有尝试进行霍夫曼编码,只需将 01 的“二进制”Strings 转换为 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 longs。无需担心分成 8 个块(除非这是家庭作业,并且这是作业的一部分)。特别是,它正确处理了您给出的示例(“11010001”=> 209)。

方法很简单:

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

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

【讨论】:

  • 如果我使用 FileInputStream read() 方法读取字节,那么有多少位仍然无关紧要吗?我知道 read() 方法会读取一个字节的数据,所以如果“1101000100000001”被完全编码而没有被分解,它会影响 read() 的工作方式吗?
  • 由于我存储数据的方式(在long 中),此方法最多只能处理 64 位。如果您以不同的方式存储数据 - 例如在 BigInteger 中,就像在这个线程的另一个答案中一样 - 此方法将处理尽可能多的位(当然是内存允许的)。只要您确定您将读取的唯一字符是'1''0',您读取字符或字节都没有区别。
【解决方案2】:

我会做不同的事情

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

【讨论】:

    猜你喜欢
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2010-09-24
    • 2016-12-10
    相关资源
    最近更新 更多