繁体   English   中英

字节形式的字符串转换为Java中的原始字符串

[英]String in byte form to original string in java

我编写了一个代码,以字节形式(使用.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());

我希望借此将字节码转换回字符串。 但是,问题在于,由于我是从文本文件中读取的,所以我猜读取的数据仍然是字符串,因此实际上我只是将字符串转换为字符串。

这是我的现状...有人知道吗?

谢谢收听。

[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();

}

你不能 您已经丢失了所有重要数据。 byte[]上调用toString()不会给您任何有用的信息,因为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);

您显示的字符串( [B@5f18cd5等]不是字节值的编码。 而是它们是java.lang.Object的默认toString()方法的输出:'类名'+“ @”'十六进制哈希码'。

您不能将其转换回字节的内容。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM