0的字符串和1的文件作为位

问题描述 投票:3回答:3

我正在研究一个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。

提前致谢!

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

java string binary byte bits
3个回答
3
投票

我想我找到了答案。我使用以下代码将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())将其转换回bitset。然后我循环遍历bitset,如下所示:

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

感谢所有帮助过我的人。


0
投票

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

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

0
投票

试试这个。

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();
© www.soinside.com 2019 - 2024. All rights reserved.