我是Stack Overflow的新手,我在编写这个程序时遇到了一些麻烦。我的目标是计算文件的CRC32哈希并以十六进制和十进制显示结果。计算十六进制的方法很好,但是当我尝试转换为十进制时,结果是关闭的。
例如十六进制af3f89fc返回时应返回2147483647(错误)2940176892
任何人都可以帮助这种方法吗?我无法弄清楚出了什么问题。
旁注:返回的十六进制字母为小写字母。
public int toDecimal(String hex){
int dec = 0;
int len = hex.length();
for(int i = 0; i < len; i++){
if(hex.charAt(i) == 'a') {
dec += 11 * Math.pow(16, len-(i+1));
}
else if(hex.charAt(i) == 'b'){
dec += 12 * Math.pow(16, len-(i+1));
}
else if(hex.charAt(i) == 'c'){
dec += 13 * Math.pow(16, len-(i+1));
}
else if(hex.charAt(i) == 'd'){
dec += 14 * Math.pow(16, len-(i+1));
}
else if(hex.charAt(i) == 'e'){
dec += 15 * Math.pow(16, len-(i+1));
}
else{
dec += Character.getNumericValue(hex.charAt(i)) * Math.pow(16, len-(i+1));
}
}
return dec;
}
感谢任何可以提供帮助的人。
答案 0 :(得分:1)
值2940176892
略大于最大可能int
,这是您得到的答案:2147483647
。
出现此值Integer.MAX_VALUE
,因为您要在int
之间添加乘法的结果,例如12
以及Math.pow
的结果,即double
。
您正在使用运算符+=
,它根据the JLS, Section 15.26.2隐式地将添加结果强制转换回所分配变量的类型,在本例中为int
}。
E1 op = E2形式的复合赋值表达式等效于E1 =(T)((E1)op(E2)),其中T是E1的类型,但E1仅被评估一次。
根据原始缩小转换的规则JLS, Section 5.1.3),大于Integer.MAX_VALUE
的值缩小为Integer.MAX_VALUE
。
- 在第一步中,浮点数转换为long(如果T为long)或转换为int(如果T为byte,short,char或int),如下所示:
醇>
(剪断)
- 否则,以下两种情况之一必须为真:
一个。该值必须太小(大幅度或负无穷大的负值),第一步的结果是int或long类型的最小可表示值。
湾该值必须太大(大幅度或正无穷大的正值),第一步的结果是int或long 类型的最大可表示值。
(强调我的)
将dec
声明为long
并声明toDecimal
以返回long
。
但是,您的角色转换也不正确。转换:
'a' -> 10
'b' -> 11
'c' -> 12
'd' -> 13
'e' -> 14
'f' -> 15 (include this case!)
然后你会得到2940176892的正确答案。