字节形式的字符串到 java 中的原始字符串
String in byte form to original string in java
我编写了一个代码,将 8 个不同的正弦值以字节形式(使用 .getbytes)写入一个文本文件。
在我 运行 之后,创建了一个包含以下内容的文件:
[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());
我希望用它把字节码转换回字符串。
但问题是,因为我正在从文本文件中读取,所以我猜读取的数据无论如何都是字符串,所以实际上我只是将字符串转换为字符串。
这是我的现状...有人知道吗?
感谢收听。
你不能。您已经丢失了所有重要数据。在 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
不是字节,它是引用的字符串表示形式。
你不能把它们变回任何东西。
public class Ref {
public static void main(final String[] args) {
System.out.println(new Ref());
}
}
//Outputs: Ref@19e0bfd
foo@address
是参考。您实际上并没有将值写入文件,而是作为字符串引用。 B[
意味着您正在将 byte[]
写入文件,而不是 in 该数组的实际字节。
更新
您可能正在寻找这样的东西:
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();
}
您显示的字符串([B@5f18cd5
等)不是字节值的编码。相反,它们是 java.lang.Object
的默认 toString()
方法的输出:'class name' + "@" 'hash code in hex'.
您无法将其转换回字节的内容。
您需要更改写入字节的方式。尝试 DataOutputStream
写入每个字节数组。
对于每个数组,使用 DataOutputStream.writeInt()
写入数组的长度,然后写入字节本身。要读回它们,请使用 DataInputStream
,首先读取长度,然后构造该长度的字节数组,然后将数据读回数组。
我编写了一个代码,将 8 个不同的正弦值以字节形式(使用 .getbytes)写入一个文本文件。
在我 运行 之后,创建了一个包含以下内容的文件: [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());
我希望用它把字节码转换回字符串。 但问题是,因为我正在从文本文件中读取,所以我猜读取的数据无论如何都是字符串,所以实际上我只是将字符串转换为字符串。
这是我的现状...有人知道吗?
感谢收听。
你不能。您已经丢失了所有重要数据。在 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
不是字节,它是引用的字符串表示形式。
你不能把它们变回任何东西。
public class Ref {
public static void main(final String[] args) {
System.out.println(new Ref());
}
}
//Outputs: Ref@19e0bfd
foo@address
是参考。您实际上并没有将值写入文件,而是作为字符串引用。 B[
意味着您正在将 byte[]
写入文件,而不是 in 该数组的实际字节。
更新
您可能正在寻找这样的东西:
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();
}
您显示的字符串([B@5f18cd5
等)不是字节值的编码。相反,它们是 java.lang.Object
的默认 toString()
方法的输出:'class name' + "@" 'hash code in hex'.
您无法将其转换回字节的内容。
您需要更改写入字节的方式。尝试 DataOutputStream
写入每个字节数组。
对于每个数组,使用 DataOutputStream.writeInt()
写入数组的长度,然后写入字节本身。要读回它们,请使用 DataInputStream
,首先读取长度,然后构造该长度的字节数组,然后将数据读回数组。