[英]byte array to string and inverse : recoverded byte array is NOT match to original byte array in 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.