【问题标题】:String to byte and viceversa in javaJava中的字符串到字节,反之亦然
【发布时间】:2012-04-18 05:44:54
【问题描述】:

我正在将 byte[] 数组转换为 string 。然后将字符串转换回 byte[] 数组。然后检查两个数组是否相等 - 我知道它们不相等:

 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>

输出:

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


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

【问题讨论】:

  • 您的字节可能不是有效的 utf-8。当它们被解析为 utf-8 字符串时,无效的序列被转换为有效的 utf-8 序列,因此字节数组是不同的。 Base64 保证是有效的 utf-8(毕竟它是 ascii 的超集)。
  • @bdares :如何将字节数组转换为字符串?里面发生了什么?
  • 如果我对用户名的值进行硬编码,我会认为这是真的。
  • @UNNI:你加密了吗?加密后的用户名转换成字符串。
  • 是的,非常....say "hello".getBytes("utf-8")。这将使您的比较成真

标签: java string byte


【解决方案1】:

如果这是加密的结果,您应该使用字符串构造函数。您没有编码文本 - 您有任意二进制数据。您需要了解本质上是文本且需要以二进制形式表示的数据(例如,将文本文件写入磁盘)与本质上是二进制且需要以文本形式表示的数据(例如,将加密数据包含在XML 文档)。

您应该使用 base64(例如 this public domain library)或可能是十六进制。这将产生保证与原始二进制数据往返的 ASCII 数据。

【讨论】:

  • 如何将字节数组转换为字符串?里面发生了什么?
  • @Ashwin:它使用已指定的任何编码,或者如果您未指定,则使用平台默认值。编码的全部意义在于将字节转换为文本,反之亦然——具体如何工作取决于实现。例如,有一些简单的编码(例如 ASCII),其中每个字节代表一个字符,反之亦然,但各种字节无效,各种字符无法识别。但是用于构造字符串的二进制数据应该始终是一个字节序列,可能是用相同编码对某些文本进行编码的结果。
  • 因此,当您直接使用 utf-8 将字节数组转换为字符串时,会检查字节数组中的每个字节,它在 utf-8 映射中有相应的文本,并且相应的字节会被替换与性格。如果映射在 utf-8 中不存在会发生什么 - 就像我的情况一样?
  • @Ashwin:不完全是,因为 UTF-8 不是固定宽度的编码。单个字符可以编码为多个字节。 (使用代理对变得更加复杂。)如果序列不是有效的 UTF-8,则序列的任何未知部分都将替换为“?” IIRC。但基本上,你根本不应该这样做。根据我的回答,改用 base64。
  • 因此 base 64 会将传入位的组转换为 6 组,然后使用其自己的字符编码方案,它将用其字符表示组。这样就不会丢失数据了吧?
猜你喜欢
  • 2012-03-06
  • 2011-05-18
  • 2014-11-18
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2014-04-16
  • 2015-12-09
  • 1970-01-01
相关资源
最近更新 更多