Rumah > Soal Jawab > teks badan
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;
}
Output:
[-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]
Mengapakah output sebelum pengekodan dan penyahkodan selepas pengekodan berbeza?
黄舟2017-05-27 17:43:40
Anda mungkin fikir (new String(b)).getBytes().equals(b)
, tetapi sebenarnya tidak begitu. (Walaupun String(s.getBytes()) baharu.sama dengan(s)
pastinya.) (new String(b)).getBytes().equals(b)
,实际上并非如此。(尽管new String(s.getBytes()).equals(s)
一定是。)
因为byte[]
转换成String
时,有些字节是未必能转换成字符的,比如第一个-106
、第二个-85
就是,所以转换成String
时前两个就变成了未知字符(表面上会显示?
,但实际上是一个Unicode字符),再转成byte[]
(你这边defaultCharset
应该是UTF-8
bait[]
ditukar kepada String
, sesetengah bait tidak boleh ditukar kepada aksara, seperti -106
yang pertama, Kedua-dua -85
adalah, jadi apabila ditukar kepada String
, dua yang pertama menjadi aksara yang tidak diketahui (pada permukaan, ?
akan dipaparkan, tetapi sebenarnya ialah aksara Unicode), dan kemudian tukarkannya kepada bait[]
(defaultCharset
anda hendaklah UTF-8
), setiap tidak diketahui Aksara menjadi 3 bait. Jika anda menggunakan GBK, keadaan tidak teruk, tetapi masih sedikit berbeza:
[-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]
Jadi kesimpulannya ialah: Jika anda menggunakan String untuk mewakili nilai Hash, anda tidak boleh menukar paksa bait[] kepada String, tetapi menukarnya kepada perwakilan heksadesimal seperti biasa. 🎜