2012-04-18 67 views
0

我将一个byte []数组转换为字符串。然后将字符串转换回byte []数组。然后在检查如果两个数组相等, - 我让他们不相等:
字符串到byte和viceversa在java中

byte[] ciphertext2=c.doFinal(username.getBytes("utf-8")); 
      //JUST CHECKING IGNORE 
      String qaz=new String(ciphertext2,"utf-8"); 
      //qaz=qaz+"1"; 
      System.out.println("just chekcing------------------------"+qaz); 
      byte[] ciphertext3=qaz.getBytes("utf-8"); 
      if(Arrays.equals(ciphertext2,ciphertext3)) 
      { 
      System.out.println("just chekcing they are equal------------------------"); 
      } 
      else 
      System.out.println("just chekcing they are not equal------------------------");<br> 

OUTPUT:

just chekcing they are not equal-------------------- 


为什么它不工作?
编辑
当使用java的Base64时,它工作得很好。但是,为什么直接将字节转换为字符串并反之亦然?将字符串转换为字节数组时实际发生了什么?反之亦然?

+1

您的字节可能无效utf-8。当它们被解析为utf-8字符串时,无效序列会变成有效的utf-8序列,因此字节数组是不同的。 Base64保证是有效的utf-8(它毕竟是ascii的超集)。 – bdares 2012-04-18 05:50:46

+0

@bdares:如何将字节数组转换为字符串?里面会发生什么? – Ashwin 2012-04-18 05:54:28

+0

如果我对用户名的值进行了硬编码,我会将其设置为true。 – UVM 2012-04-18 05:57:57

回答

4

如果这是加密的结果,您应该使用字符串构造函数而不是。你没有编码文本 - 你有任意的二进制数据。您需要理解基本上是文本的数据和需要用二进制表示的数据(例如,将文本文件写入磁盘)和基本上是二进制的数据之间的区别,以及需要用文本表示的数据(例如包括加密数据XML文档)。

您应该使用base64(例如this public domain library)或十六进制。这将导致ASCII数据保证返回到原始二进制数据。

+0

如何将字节数组转换为字符串?里面会发生什么? – Ashwin 2012-04-18 05:57:34

+0

@Ashwin:它使用指定的任何编码,如果没有指定,则使用平台默认值。编码的全部要点是将字节转换为文本,反之亦然 - 它的工作原理取决于实现。例如,有一些简单的编码(例如ASCII),其中每个字节表示单个字符,反之亦然,但各种字节无效并且不能识别各种字符。但是用来构造字符串的二进制数据应该始终是一个字节序列,它可能是用相同编码对某些文本进行编码的结果。 – 2012-04-18 06:07:22

+0

所以,当你使用utf-8直接将字节数组转换为字符串时,将检查字节数组中的每个字节,它在utf-8映射中具有对应的文本,并将相应的字节替换为字符。如果映射不在utf-8中会发生什么情况 - 就像我的情况那样? – Ashwin 2012-04-18 06:20:12