java - Mengenai pengekodan rentetan.
我想大声告诉你
我想大声告诉你 2017-05-27 17:41:40
0
1
721
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?

我想大声告诉你
我想大声告诉你

membalas semua(1)
黄舟

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

Oleh kerana apabila 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. 🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan