java - À propos du codage des chaînes.
我想大声告诉你
我想大声告诉你 2017-05-27 17:41:40
0
1
693
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;
}

Sortie :
[-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]

Pourquoi les sorties avant encodage et décodage après encodage sont-elles différentes ?

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

répondre à tous(1)
黄舟

Vous pensez peut-être (new String(b)).getBytes().equals(b), mais ce n'est pas réellement le cas. (Bien que new String(s.getBytes()).equals(s) le soit définitivement.) (new String(b)).getBytes().equals(b),实际上并非如此。(尽管new String(s.getBytes()).equals(s)一定是。)

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

Parce que lorsque byte[] est converti en String, certains octets peuvent ne pas être convertis en caractères, comme le premier -106, les deux -85 le sont, donc une fois convertis en String, les deux premiers deviennent des caractères inconnus (en surface, ? sera affiché, mais en fait est un caractère Unicode), puis convertissez-le en byte[] (votre defaultCharset doit être UTF-8), chaque inconnu Les caractères deviennent 3 octets.

Si vous utilisez GBK, la situation n'est pas mauvaise, mais quand même légèrement différente :

[-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]
La conclusion est donc la suivante : Si vous utilisez String pour représenter une valeur de hachage, vous ne pouvez pas forcer la conversion de byte[] en String, mais le convertir en représentation hexadécimale comme d'habitude. 🎜
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal