簡體   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