簡體   English   中英

字節到字符串,反之亦然

[英]byte to string and vice versa

我需要轉換一個隨機生成的鹽值並將其存儲在數據庫中。 為了將其存儲在數據庫中,我將其轉換為字符串。 然后,為了檢索原始值,我將其轉換回字節。 但是兩個值都不匹配。 我已經嘗試過“ UTF-8”,“ UTF-16”,BASE64Encoder。

SecureRandom ranGen = new SecureRandom();
byte[] aesKey = new byte[16]; // 16 bytes = 128 bits
ranGen.nextBytes(aesKey);   
System.out.println(aesKey);

String a=new String(aesKey,"UTF-16");
byte[] b=new byte[16];
b=a.getBytes("UTF-16");
System.out.println(b);

上面代碼的輸出(執行兩次):

[B@11563ff
[B@1581593

[B@170888e
[B@11563ff

您確實應該使用Base64將二進制數據轉換為字符串。 有許多免費的實現,例如在Apache Commons Codec中找到的實現。

另外,它真的很容易使用,例如:

對於編碼:

import org.apache.commons.codec.binary.Base64;
...
byte[] abValue = {...}; // Your data to encode
Base64 base64 = new Base64();
String strEncodedData = base64.encodeToString(abValue).trim();

對於解碼:

import org.apache.commons.codec.binary.Base64;
...
String strEncodedData = "..."; // Your previously encoded data
Base64 base64 = new Base64();
byte[] abValue = base64.decode(strValue);

在上面編寫代碼時,先打印aesKey然后b ,實際上要打印的是數組對象的toString方法的輸出,這只是默認的Object toString方法。 所以我看不出您怎么能期望它們是相同的。

如果您確實要檢查它們是否相同,則應逐字節比較它們。

關於將字節[]作為字符串存儲在數據庫中的實際問題,最好的選擇是對Base64進行編碼。 我建議為此使用Apache Commons Codec庫。 請參閱用戶指南

編輯:

使用您所引用的BASE64Encode和BASE64Decoder,代碼如下所示:

    SecureRandom ranGen = new SecureRandom();
    byte[] aesKey = new byte[16]; // 16 bytes = 128 bits
    ranGen.nextBytes(aesKey);
    String a = new BASE64Encoder().encode(aesKey);

    System.out.println(a);

    byte[] b = new BASE64Decoder().decodeBuffer(a);
    System.out.println(new BASE64Encoder().encode(b));

    for (int i = 0; i < aesKey.length; i++) {
        System.out.println(aesKey[i] + " " + b[i]);
    }

在這里,我還逐個遍歷了字節,以表明它們確實相等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM