Шестнадцатеричное в целое в Java - PullRequest
28 голосов
/ 04 мая 2011

Я пытаюсь преобразовать шестнадцатеричное значение String в целое число.Шестнадцатеричная строка была вычислена из хеш-функции (sha-1).Я получаю эту ошибку: java.lang.NumberFormatException.Я думаю, что это не нравится строковое представление шестнадцатеричного.Как я могу этого достичь.Вот мой код:

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();

}

Например, когда я передаю эту строку: _DTOWsHJbEeC6VuzWPawcLA , его хеш его:get: java.lang.NumberFormatException: Для входной строки: " 0xC934E5D372B2AB6D0A50B9F0341A00ED029BDC15 "

Мне действительно нужно это сделать.У меня есть коллекция элементов, идентифицируемых их UUID, которые являются строкой.Я должен буду хранить эти элементы, но мои ограничения - использовать целое число в качестве их идентификатора.Вот почему я вычисляю хэш заданного параметра, а затем конвертирую в int.Может быть, я делаю это неправильно, но может кто-то дать мне совет, чтобы достичь этого правильно !!

Спасибо за вашу помощь !!

Ответы [ 6 ]

85 голосов
/ 04 мая 2011

Почему вы не используете для этого функции Java:

Если ваши числа маленькие (меньше ваших), вы можете использовать: Integer.parseInt(hex, 16) для преобразования шестнадцатеричной строки в целое число.

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

Для больших чисел, подобных вашей, используйте public BigInteger(String val, int radix)

  BigInteger value = new BigInteger(hex, 16);

@ См. JavaDoc:

1 голос
/ 04 апреля 2018

Попробуйте это

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 голос
/ 04 августа 2015

Вы можете использовать этот метод: https://stackoverflow.com/a/31804061/3343174 он прекрасно преобразует любое шестнадцатеричное число (представленное в виде строки) в десятичное число

0 голосов
/ 04 мая 2011

Я наконец-то нашел ответы на свой вопрос на основе всех ваших комментариев.Спасибо, я попробовал это:

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");
    }
    //....
}

Это решение не является оптимальным, но я могу продолжить свой проект.Еще раз спасибо за вашу помощь

0 голосов
/ 04 мая 2011

Это потому, что byte[] output это хорошо, и массив байтов, вы можете думать о нем как о массиве байтов, представляющих каждый целое число, но когда вы добавляете их все в одну строку, вы получаете что-то, что НЕ являетсяцелое число, вот почему.Вы можете иметь его как массив целых чисел или попытаться создать экземпляр BigInteger .

0 голосов
/ 04 мая 2011

SHA-1 создает 160-битное сообщение (20 байт), слишком большое, чтобы его можно было сохранить в значении int или long. Как предполагает Ральф, вы можете использовать BigInteger.

Чтобы получить (менее безопасный) int хеш, вы можете вернуть хэш-код возвращенного байтового массива.

В качестве альтернативы, если вам совсем не нужен SHA, вы можете просто использовать строковый хеш-код UUID.

...