字节形式的字符串到java中的原始字符串

时间:2016-09-16 07:41:51

标签: java string bytearray

我编写了一个代码,以字节形式(使用.getbytes)将8个不同的正弦值写入文本文件。

运行后,会创建一个包含以下内容的文件:     [B @ 5f18cd5     [B @ 1c515979     [B @ 20c92575     [B @ 75ba3523     [B @ f4c7f77     [B @ 67446579     [B @ 3b621fe6     [B @ 271c537f

到目前为止一直很好......

我现在想在另一个Java项目中反转整个过程。为此,我需要知道如何转向例如[B @ 1c515979回到它的初始值0.7071。

我尝试使用

System.out.println("Text [Byte Format] : " + bytes.toString());

我希望将字节代码转换回字符串。 但问题是,因为我正在从文本文件中读取,所以我认为读取数据无论如何都是字符串,所以实际上我只是将字符串转换为字符串。

这是我的现状......任何人都有了想法?

感谢收听。

3 个答案:

答案 0 :(得分:2)

[B@5f18cd5不是一个字节,它是引用的字符串表示。 你不能把它们变成任何东西。

public class Ref {
    public static void main(final String[] args) {
        System.out.println(new Ref());
    }
}
//Outputs: Ref@19e0bfd

foo@address是一个参考。您实际上并没有将值写入文件,而是作为String引用。 B[表示您正在将byte[]写入文件,而不是该数组中的实际字节

<强>更新

你可能正在寻找这样的东西:

public static void main(final String[] args) throws FileNotFoundException,
        IOException {
    final File f = new File("/tmp/output");

    final ObjectOutputStream oos = new ObjectOutputStream(
            new FileOutputStream(f));

    for (int i = 0; i < 8; i++) {
        final double d = Math.sin(i);
        System.out.println(d);
        oos.writeDouble(d);
    }

    oos.flush();
    oos.close();

    System.out.println("---");

    final ObjectInputStream ois = new ObjectInputStream(
            new FileInputStream(f));

    for (int i = 0; i < 8; i++)
        System.out.println(ois.readDouble());

    ois.close();

}

答案 1 :(得分:1)

你做不到。您已经丢失了所有重要数据。在toString()上调用byte[]并没有给你任何有用的东西,因为Java中的数组不会覆盖toString() ...所以你从Object获得实现,它只是表示类型和哈希码(实际上是数组的身份哈希码)。如果修改字节数组的内容并在其上调用toString(),则会得到相同的值。

相反,您需要更改保存数据的方式。如果你可以完全避免需要文本文件,那将是理想的......但如果你需要一个文本文件,最简单的选择可能是将二进制数据转换为base64,例如使用java.util.Base64

String text = Base64.getEncoder().encodeToString(bytes);
// Write out text...

...

// String text = // read from a file
byte[] bytes = Base64.getDecoder().decode(text);

答案 2 :(得分:0)

您显示的字符串([B@5f18cd5等)不是字节值的编码。相反,它们是toString()的默认java.lang.Object方法的输出:&#39;类名&#39; +&#34; @&#34; &#39;哈希码为十六进制&#39;。

您无法将其转换回字节的内容。

您需要更改写入字节的方式。尝试DataOutputStream写入每个字节数组。

对于每个数组,使用DataOutputStream.writeInt()写入数组的长度,然后使用字节本身。要回读它们,请使用DataInputStream,首先读取长度,然后构造该长度的字节数组,然后将数据读回数组。