将1和0的字符串转换为二进制文件
所以我有一个数以千计的1和0的字符串,我想以二进制文件的形式保存到文件中(因此文件大小很小)。不幸的是,我不知道如何在没有运行NumberFormatExceptions的情况下做到这一点。将1和0的字符串转换为二进制文件
我试过Byte.parseByte,但似乎没有工作。任何帮助将不胜感激。
try {
File file = new File(BINARY_FILE);
DataOutputStream dso = new DataOutputStream(new FileOutputStream(file));
for (int j = 0; j < bits.length(); j += 8) {
Byte b = Byte.parseByte(bits.substring(j, j + 8));
dso.write(b);
}
} catch (IOException e) {
System.out.println("Error");
}
如果您只想写入字节,请不要用DataOutputStream
打包。
您也应该使用try-with-resources完成后关闭文件流。
解析8位时,需要指定基数2,否则就是解析基数为10的数字,而不是二进制。
解析是针对带符号的数字的,因此,由于您使用的是8位无符号字节,因此应该解析为int
而不是byte
。
您不应该使用valueOf()
,而是使用parseInt()
。不需要获得装箱对象。
所以,你的代码应该是:
try {
File file = new File(BINARY_FILE);
try (FileOutputStream out = new FileOutputStream(file)) {
for (int j = 0; j < bits.length(); j += 8) {
int b = Integer.parseInt(bits.substring(j, j + 8), 2);
out.write(b);
}
}
} catch (IOException e) {
System.out.println("Error");
}
parseByte(s, 2)
是一个有符号解析,所以它onlu支持"-10000000"
(-128 )和"01111111"
(127 )之间的值。任何以1
开头的8位二进制数将会失败java.lang.NumberFormatException: Value out of range. Value:"11111111" Radix:2
虽然仅仅是因为符号,但在8位字节的情况下使用32位整数似乎有点低效。 –
@DM ['write()'](https://docs.oracle.com/javase/8/docs/api/java/io/FileOutputStream.html#write-int-)以'int'作为参数,即使它只使用低8位,无论你是解析为“byte”,“short”还是“int”,它都会被转换为“int”。无法解析字节而没有错误,所以不妨将其解析为'int',因为这是方法所需的。 – Andreas
这看起来很有效,但如果有更好的东西,它会继续尝试和改进。 – BananaPineapple
我想解决一个尚未解决的问题:如何处理奇数位。
您不能将单个位写入文件,只能写入字节。文件大小始终为全字节,即使Java可以处理文件大小为小数部分的文件,文件系统也无法处理。
为了输出的最后几个数字可能会或可能不会是一个完整的8,你可以做这样的事情:
for (int j = 0; j < bits.length(); j += 8) {
int b;
if (j + 8 < bits.length())
{
b = Integer.parseInt(bits.substring(j, j + 8), 2);
}
else
{
b = Integer.parseInt(bits.substring(j), 2);
}
dso.write(b);
}
现在你substring
不会熄灭的字符串的结尾。
至于如何区分以“00001111”结尾的字符串与以“1111”结尾的字符串(它们具有相同的字节值)之间的区别,也许您可以在文件的开头写入一个字节值bits.length % 8
。这会让你知道如何处理最后一个字节。例如,如果它是6,那么你知道1111确实是“001111”而不是“1111”。如果它是4,那么它确实是“1111”。
显示你已经试过的代码 –
增加,位变量是1和0的字符串。 – BananaPineapple
另外,我们保证字符串的长度可以被8整除吗? –