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";
}
}
感谢所有帮助过我的人。
我正在处理 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";
}
}
感谢所有帮助过我的人。