0 和 1 的字符串以位的形式归档

String of 0's and 1's to File as bits

我正在处理 Huffman java 应用程序,我快完成了。不过我有一个问题。我需要将类似“101011101010”的字符串保存到文件中。当我用我当前的代码保存它时,它会将它保存为字符,每个 0 或 1 占用 1 个字节。我很确定可以将每个 0/1 保存为一个位。

我已经用 BitSet 和 Integer.valueOf 尝试了一些东西,但我无法让它们工作。这是我当前的代码:

FileOutputStream fos = new FileOutputStream("encoded.bin");
fos.write(encoded.getBytes());
fos.close();

其中 'encoded' 是一个字符串,可以是:“0101011101”。 如果我尝试将其保存为整数,则前导 0 将被删除。

提前致谢!

编辑:霍夫曼是一种压缩方法,所以输出的文件应该尽可能小。

二进制文件仅限于存储八的倍数位。您可以通过将字符串切成八位块,使用 Byte.parseByte(eightCharString, 2) 将它们转换为字节并将它们添加到字节数组来解决此问题:

  • 通过将位串的长度除以八来计算字节数组的长度
  • 分配所需长度的字节数组
  • 运行 一个循环,从表示八的倍数的位置处的字符串中获取子字符串
  • 对每个chunk进行解析,并将结果放入对应的byte
  • 在字节数组上调用fos.write()

试试这个。

String encoded = "0101011101";
FileOutputStream fos = new FileOutputStream("encoded.bin");
String s = encoded + "00000000".substring(encoded.length() % 8);
for (int i = 0, len = s.length(); i < len; i += 8)
    fos.write((byte)Integer.parseInt(s.substring(i, i + 8), 2));
fos.close();

我想我找到了答案。我使用以下代码将 1 和 0 放入 BitSet 中:

BitSet bitSet = new BitSet(encoded.length());
int bitcounter = 0;
for(Character c : encoded.toCharArray()) {
    if(c.equals('1')) {
        bitSet.set(bitcounter);
    }
    bitcounter++;
}

之后,我使用 bitSet.toByteArray() 将其保存到文件中 当我想再次阅读它时,我使用 BitSet.valueOf(bitSet.toByteArray()) 将它转换回位集。然后我像这样循环遍历位集:

String binaryString = "";
for(int i = 0; i <= set.length(); i++) {
    if(set.get(i)) {
        binaryString += "1";
    } else {
        binaryString += "0";
    }
}

感谢所有帮助过我的人。