字节到字符串,反之亦然

我需要转换随机生成的salt值并将其存储在数据库中。 为了将它存储在数据库中,我将其转换为字符串。 然后,为了检索原始值,我将其转换回字节。 但两个值都不匹配。 我试过“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); 

上述代码的输出(执行2次):

 [B@11563ff [B@1581593 

 [B@170888e [B@11563ff 

当你的代码写在上面,打印aesKey然后打印b ,你实际打印的是数组对象的toString方法的输出,它只是默认的Object toString方法。 所以我不明白你怎么能期望它们是一样的。

如果你真的想检查它们是否相同,你应该逐字节地比较它们。

关于在DB中将byte []存储为字符串的实际问题,最好的办法是对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]); } 

在这里,我还单独循环遍历字节,以表明它们确实是相等的。

你真的应该使用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);