字节到字符串,反之亦然
我需要转换随机生成的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);