Java中的十六进制转整数

Posted

技术标签:

【中文标题】Java中的十六进制转整数【英文标题】:Hexadecimal to Integer in Java 【发布时间】:2011-08-18 16:49:25 【问题描述】:

我正在尝试将十六进制字符串转换为整数。字符串十六进制是从散列函数 (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:对于输入字符串:“0xC934E5D372B2AB6D0A50B9F0341A00ED029BDC15

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

感谢您的帮助!!

【问题讨论】:

首先数字对于常规整数来说太大了。 正如安德烈所说,它不适合常规整数。如果你愿意改成 java.math.BigInteger,你可以return new BigInteger(1, digest.digest()) 【参考方案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
    

【讨论】:

【参考方案2】:

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

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

这个解决方案不是最优的,但我可以继续我的项目。再次感谢您的帮助

【讨论】:

【参考方案3】:

你可以使用这个方法:https://***.com/a/31804061/3343174 它完美地将任何十六进制数(以字符串表示)转换为十进制数

【讨论】:

【参考方案4】:

你为什么不为此使用 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:

Integer.parseInt(String value, int radix) BigInteger(String value, int radix)

【讨论】:

我真的没有得到这个答案,这不是他已经在Integer i = Integer.parseInt(hex,16);尝试的吗? 另外去掉0x部分...我不知道这是允许的..如果你能保证它永远是0xABC982..,那么你总是可以删除前 2 个字符 我认为您的意思是在您的第三行代码中实例化一个新的 BigInteger?直接从字节数组构造而不是十六进制字符串表示也应该更有效。 @eggyal:你是对的,它是新的 BigInteger - 我已经更正了它【参考方案5】:

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

【讨论】:

是否可以从 BigInteger 转换为 Integer? 仅当 BigInteger 的值不大于 Integer.MAX_VALUE 时才会如此。见:download.oracle.com/javase/6/docs/api/java/math/… 这个答案基本没有意义。字节数组只是一个多精度数。不回答问题。【参考方案6】:

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

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

或者,如果您根本不需要 SHA,您可以只使用 UUID 的字符串哈希码。

【讨论】:

我尝试使用 UUID 的字符串哈希码,但也遇到了 IllegalArgumentException。这就是我放弃 UUID 的原因;顺便说一句,我什至不知道他们如何生成他们的 UUID,这不是我的项目 “UUID 的字符串哈希码”是指uuid.hashCode()(它使用函数String.hashCode())。我看不出这给了 IAE? 是的,我知道。我刚试过这个方法。但问题是当我尝试 String id = UUID.fromString(uuid) 我得到一个 IllegalArgumentException。

以上是关于Java中的十六进制转整数的主要内容,如果未能解决你的问题,请参考以下文章

[蓝桥] 基础练习 十六进制转八进制(java)

蓝桥杯 十六进制转八进制(超大测试数据,java实现)

java蓝桥杯 试题-基础练习-十六进制转八进制

Java基础之数据类型

输入一个十进制整数,输出该数二进制表示中1的个数。其中负数用补码表示

java中如何声明一个十六进制的字符串,或者说,怎么发送一个十六进制数据?