Java中的十六进制到整数

时间:2011-05-04 16:23:11

标签: java integer hex

我正在尝试将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 时,他的哈希值为: 0xC934E5D372B2AB6D0A50B9F0341A00ED029BDC15

但是我得到:java.lang.NumberFormatException:对于输入字符串:&#34; 0xC934E5D372B2AB6D0A50B9F0341A00ED029BDC15 &#34;

我真的需要这样做。我有一个由UUID标识的元素集合,它们是字符串。我将不得不存储这些元素,但我的限制是使用整数作为他们的id。这就是我计算给定参数的哈希然后转换为int的原因。也许我做错了,但有人可以给我一个建议,以正确实现!

感谢您的帮助!!

6 个答案:

答案 0 :(得分:83)

为什么不使用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);

@See JavaDoc:

答案 1 :(得分:1)

您可以使用此方法:https://stackoverflow.com/a/31804061/3343174 它将任何十六进制数字(以字符串形式显示)转换为十进制数

答案 2 :(得分:1)

试试这个

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
    }

答案 3 :(得分:0)

SHA-1产生160位消息(20字节),太大而无法存储在intlong值中。正如拉尔夫建议的那样,你可以使用BigInteger。

要获得(不太安全)的int哈希,可以返回返回的字节数组的哈希码。

或者,如果您根本不需要SHA,则可以使用UUID的String哈希码。

答案 4 :(得分:0)

我终于根据您的所有评论找到了我的问题的答案。谢谢,我试过这个:

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

此解决方案并非最佳,但我可以继续我的项目。再次感谢您的帮助

答案 5 :(得分:-2)

那是因为byte[] output很好,并且字节数组,您可以将其视为一个字节数组,表示每个字节都是一个整数,但当您将它们全部添加到单个字符串中时,您会得到一些东西。不是整数,这就是原因。您可以将其作为整数数组或尝试创建BigInteger的实例。