2017-04-12 52 views
1

我有下面这段代码的整数值:我如何获得的十六进制字符串

try { 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    byte[] byteArray = md.digest(myString.getBytes("UTF-8")); 
    StringBuffer sb = new StringBuffer(); 
    for (int i = 0; i < byteArray.length; i++) { 
    sb.append(Integer.toString((byteArray[i] & 0xff) + 0x100, 16).substring(1)); 
    } 

    int n = (int) Long.parseLong(sb.toString()); 
    System.out.println(n); 
} catch (Exception e) { 
    System.out.println(e.getMessage()); 
} 

出于某种原因,我不断收到输出:

For input string: "4739c5c11d833bb199c16ff95a92b267"

当在此任何地方代码我有这个print声明...

我想获得上面的十六进制字符串的int值,我不知道发生了什么。

+0

另外'myString'变量值是'123445' – CapturedTree

+0

使用'Long.parseLong(“123445”,16)'将十六进制字符串转换为int/long。在你的情况下,'md5'的值太长,也会被int或long存储。 – neuo

+0

该信息最好直接在问题中。下次放置完整的[mcve],包括完整的异常消息/堆栈跟踪。 – GhostCat

回答

1

您创建了输入字符串的md5散列。

哈希值是47 ....值!

而且该值太大而不适合long或int变量!因此,你会得到一个例外,并且catch块将会启动。

长话短说:退一步,重新考虑这个方法应该做什么。因为它不能以这种方式工作。

除此之外:解析十六进制字符串时,你必须使用

parseLong(input, 16) 

为了告诉我们,它应该期待一个十六进制数字的Java。

我的直觉在这里:你负担过重。您缺少非常基本的Java语言元素的知识,但您打算使用MessageDigest等高级概念。

编辑:给出您的评论:阅读BigInteger类。那个提供了保持任意大整数的手段。

+0

带'47 ...'的散列是一个128位的值。我需要将其转换为数字值(不是现在的字符串),并将其修改为4以得到'0 - 3'之间的数字。我有没有办法做到这一点?我应该使用不同的散列算法吗?是的,你的直觉很准确。我有一个学校项目,我需要这样做。教授说使用MD5散列并且用4修改得到0-3之间的数字。 – CapturedTree

+0

查看我的更新。你不应该用那么久,而是BigInteger类。 – GhostCat

+0

好的非常感谢你。我只是'System.out.println(newBigInteger(sb.toString(),16).mod(new BigInteger(“3”)));'它现在已经工作了。 – CapturedTree

1

该输出来自在catch块中打印异常消息。

抛出异常是因为您要解析的数字太大而不适合long数据类型。