为了账号安全,请及时绑定邮箱和手机立即绑定

关于字符串编码。

关于字符串编码。

慕姐8265434 2019-03-01 11:01:04
public static void main(String[] args) throws Exception { String str = "resource"; System.out.println(Arrays.toString(getHash(str,"MD5").getBytes()));//使用默认解码后输出 } public static String getHash(String str, String hashType) { try { MessageDigest digest = MessageDigest.getInstance(hashType); digest.reset(); byte[] b = digest.digest(str.getBytes()); System.out.println(Arrays.toString(b)); //编码前输出 return new String(b); //使用默认编码 } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return str; } 输出:[-106, -85, 78, 22, 63, 78, -32, 58, -86, 77, 16, 81, -86, 81, -46, 4] [-17, -65, -67, -17, -65, -67, 78, 22, 63, 78, -17, -65, -67, 58, -17, -65, -67, 77, 16, 81, -17, -65, -67, 81, -17, -65, -67, 4] 为什么编码前和编码后再解码所输出的不一样?
查看完整描述

1 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

你可能认为(new String(b)).getBytes().equals(b),实际上并非如此。(尽管new String(s.getBytes()).equals(s)一定是。)

因为byte[]转换成String时,有些字节是未必能转换成字符的,比如第一个-106、第二个-85就是,所以转换成String时前两个就变成了未知字符(表面上会显示?,但实际上是一个Unicode字符),再转成byte[](你这边defaultCharset应该是UTF-8吧),每个未知字符就变成3个字节了。

如果用GBK的话,情况还算好,但还是略有不同:

[-106, -85, 78, 22, 63, 78, -32, 58, -86, 77, 16, 81, -86, 81, -46, 4]
[-106, -85, 78, 22, 63, 78, 63, 58, -86, 77, 16, 81, -86, 81, 63, 4]

所以结论是:如果用String表示一个Hash值,不能把byte[]强转换成String,而是按惯例转换成16进制表示

查看完整回答
反对 回复 2019-03-01
  • 1 回答
  • 0 关注
  • 413 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信