java - 将 1's and 0' 的序列拆分为字节

标签 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]);
            }

附注有些部分是我从网上抄来的,所以不太理解(如 target |= 1<< bitCount )

最佳答案

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

方法非常简单:

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

此外,代码假设您获得的位字符串不超过 64 位,您可能需要检查其稳健性。

关于java - 将 1's and 0' 的序列拆分为字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16270388/

相关文章:

java - Java是否将文件路径中的多个斜杠 "\\\\\\"视为单个 "\\"?

java - 从文件中读取随机单词

file - 为什么 touch 会调用 dup2() 系统调用?

c++ - C++ 中的二进制文件,更改音频文件中原始数据的内容

javascript - 在服务器端解压LZString(java)

c++ - 流式文件增量编码/解码

java - 为什么这段带有泛型的java代码不能编译

java - Integer.parseInt 不会将 String 解析为 int

Java 如何提高读取 50G 文件的能力

jquery - 在 Linux 主机上启用压缩