将1&0;和0&#39的字符串转换为二进制文件

时间:2017-02-22 06:18:36

标签: java string binary

所以我有一个包含数千个1和0的字符串,我想以二进制形式保存到文件中(因此文件大小很小)。不幸的是,如果没有遇到NumberFormatExceptions,我无法弄清楚如何做到这一点。

我已经尝试过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");
    }

2 个答案:

答案 0 :(得分:2)

如果您只想写字节,请不要用DataOutputStream换行。

完成后,您还应该使用try-with-resources关闭文件流。

解析8位时,需要指定基数2,否则你要解析基数为10的数字,而不是二进制数。

解析用于有符号数字,因此,由于您使用的是8位无符号字节,因此应解析为int,而不是byte 1

您不应使用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");
}

1 parseByte(s, 2)是一个已签名的解析,因此它支持"-10000000"(-128 10 )和"01111111"之间的值(127 <子> 10 )。以1开头的任何8位二进制数都将失败,并显示java.lang.NumberFormatException: Value out of range. Value:"11111111" Radix:2

答案 1 :(得分:1)

我想解决尚未解决的问题:如何处理奇数位。

您不能将单个位写入文件,只能写入字节。文件大小总是完整的字节,即使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”。