将bytes []转换为string,然后返回byte []时出现问题

时间:2011-03-26 14:47:39

标签: java string

在尝试使用AES和RSA建立安全连接时,我发现当我尝试将密钥转换为字符串以通过网络发送它时,它再次转换为byte []。价值观发生了变化你可以看到下面涉及的代码来理解我的想法。

public class test {
     public static String asHex (byte buf[]) {
      StringBuffer strbuf = new StringBuffer(buf.length * 2);
      int i;

      for (i = 0; i < buf.length; i++) {
       if (((int) buf[i] & 0xff) < 0x10)
        strbuf.append("0");

       strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
      }

      return strbuf.toString();
     }

 public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException  {


  KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);

SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();

String r = new String(raw,"UTF-8");

System.out.println(asHex(raw));// prints for example fd812245c9bfc4106294d51bf27e3796

byte[] t = r.getBytes("UTF-8");

System.out.println(asHex(t));  // prints for example : efbfbd2245c9bfefbfbd1062efbfbdefbfbd1befbfbd7e37efbfbd

  }
}

3 个答案:

答案 0 :(得分:4)

这是因为原始字节数组转换为UTF-8字符串。由于并非每个字节序列都是有效的UTF-8字符串,因此String构造函数可以在转换为有效字符串排序时对其进行修改。

答案 1 :(得分:4)

使用String(byte[], String)构造函数时,您会说:“这是某些文本的编码版本,这是编码。”

这里的不是案例。您没有编码文本 - 您有不透明的二进制数据。它根本不是文本数据。使用Base64将其安全地转换为纯ASCII字符串。您可以使用public domain Java encoder/decoder

答案 2 :(得分:0)

这就是为什么你应该使用十六进制(或更好的 - base64)表示来传输字节数组。