字节到字符串,反之亦然

时间:2012-02-15 09:11:26

标签: java encoding character-encoding bytearray

我需要转换随机生成的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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

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

关于在DB中将byte []存储为字符串的实际问题,最好的办法是对Base64进行编码。我建议使用Apache Commons Codec库。请参阅user guide

编辑:

使用您所提到的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]);
    }

在这里,我还单独循环查看字节,以表明它们确实是相同的。