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 字节),太大而无法存储在 int
或 long
值中。正如 Ralph 建议的那样,您可以使用 BigInteger。
要获得(不太安全的)int 散列,您可以返回返回的字节数组的散列码。
或者,如果您根本不需要 SHA,您可以只使用 UUID 的字符串哈希码。
【讨论】:
我尝试使用 UUID 的字符串哈希码,但也遇到了 IllegalArgumentException。这就是我放弃 UUID 的原因;顺便说一句,我什至不知道他们如何生成他们的 UUID,这不是我的项目 “UUID 的字符串哈希码”是指uuid.hashCode()
(它使用函数String.hashCode()
)。我看不出这给了 IAE?
是的,我知道。我刚试过这个方法。但问题是当我尝试 String id = UUID.fromString(uuid) 我得到一个 IllegalArgumentException。以上是关于Java中的十六进制转整数的主要内容,如果未能解决你的问题,请参考以下文章