[英]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.