web-dev-qa-db-fra.com

Hexadécimal en entier en Java

J'essaie de convertir une chaîne hexadécimale en entier. La chaîne hexadécimale a été calculée à partir d'une fonction de hachage (sha-1). J'obtiens cette erreur: Java.lang.NumberFormatException. Je suppose qu'il n'aime pas la représentation String de l'hexadécimal. Comment puis-je y parvenir. Voici mon code:

public Integer calculateHash(String uuid) {

    try {
        MessageDigest digest = MessageDigest.getInstance("SHA1");
        digest.update(uuid.getBytes());
        byte[] output = digest.digest();

        String hex = hexToString(output);
        Integer i = Integer.parseInt(hex,16);
        return i;           

    } catch (NoSuchAlgorithmException e) {
        System.out.println("SHA1 not implemented in this system");
    }

    return null;
}   

private String hexToString(byte[] output) {
    char hexDigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'A', 'B', 'C', 'D', 'E', 'F' };
    StringBuffer buf = new StringBuffer();
    for (int j = 0; j < output.length; j++) {
        buf.append(hexDigit[(output[j] >> 4) & 0x0f]);
        buf.append(hexDigit[output[j] & 0x0f]);
    }
    return buf.toString();

}

Par exemple, lorsque je passe cette chaîne: _ DTOWsHJbEeC6VuzWPawcLA, son hachage son: xC934E5D372B2AB6D0A50B9F0341A00ED029BDC15

Mais j'obtiens: Java.lang.NumberFormatException: Pour la chaîne d'entrée: "xC934E5D372B2AB6D0A50B9F0341A00ED029BDC15"

J'ai vraiment besoin de le faire. J'ai une collection d'éléments identifiés par leur UUID qui sont des chaînes. Je vais devoir stocker ces éléments mais ma restriction est d'utiliser un entier comme identifiant. C'est pourquoi je calcule le hachage du paramètre donné puis je le convertis en int. Peut-être que je me trompe, mais quelqu'un peut-il me donner des conseils pour y parvenir correctement !!

Merci de votre aide !!

28
Dimitri

Pourquoi n'utilisez-vous pas la fonctionnalité Java pour cela:

Si vos nombres sont petits (plus petits que les vôtres), vous pouvez utiliser: Integer.parseInt(hex, 16) pour convertir une chaîne hexadécimale en entier.

  String hex = "ff"
  int value = Integer.parseInt(hex, 16);  

Pour les grands nombres comme le vôtre, utilisez public BigInteger(String val, int radix)

  BigInteger value = new BigInteger(hex, 16);

@See JavaDoc:

87
Ralph

Essaye ça

public static long Hextonumber(String hexval)
    {
        hexval="0x"+hexval;
//      String decimal="0x00000bb9";
        Long number = Long.decode(hexval);
//.......       System.out.println("String [" + hexval + "] = " + number);
        return number;
        //3001
    }
1
wahid

vous pouvez utiliser cette méthode: https://stackoverflow.com/a/31804061/3343174 il convertit parfaitement n'importe quel nombre hexadécimal (présenté sous forme de chaîne) en nombre décimal

1
Fakher

Je trouve enfin des réponses à ma question sur la base de tous vos commentaires. Merci, j'ai essayé ceci:

public Integer calculateHash(String uuid) {

    try {
        //....
        String hex = hexToString(output);
        //Integer i = Integer.valueOf(hex, 16).intValue();
        //Instead of using Integer, I used BigInteger and I returned the int value.
        BigInteger bi = new BigInteger(hex, 16);
        return bi.intValue();`
    } catch (NoSuchAlgorithmException e) {
        System.out.println("SHA1 not implemented in this system");
    }
    //....
}

Cette solution n'est pas optimale mais je peux continuer mon projet. Merci encore pour votre aide

0
Dimitri

SHA-1 produit un message de 160 bits (20 octets), trop volumineux pour être stocké dans une valeur int ou long. Comme le suggère Ralph, vous pouvez utiliser BigInteger.

Pour obtenir un hachage int (moins sécurisé), vous pouvez renvoyer le code de hachage du tableau d'octets renvoyé.

Alternativement, si vous n'avez pas vraiment besoin de SHA du tout, vous pouvez simplement utiliser le code de hachage de chaîne de l'UUID.