在Java中将十六进制转换为十进制

时间:2015-08-04 17:32:40

标签: java hex decimal

我是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;
}

感谢任何可以提供帮助的人。

1 个答案:

答案 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

  
      
  1. 在第一步中,浮点数转换为long(如果T为long)或转换为int(如果T为byte,short,char或int),如下所示:
  2.   

(剪断)

  
      
  • 否则,以下两种情况之一必须为真:
  •   
     

一个。该值必须太小(大幅度或负无穷大的负值),第一步的结果是int或long类型的最小可表示值。

     

湾该值必须太大(大幅度或正无穷大的正值),第一步的结果是int或long 类型的最大可表示值。

(强调我的)

dec声明为long并声明toDecimal以返回long

但是,您的角色转换也不正确。转换:

'a' -> 10
'b' -> 11
'c' -> 12
'd' -> 13
'e' -> 14
'f' -> 15 (include this case!)

然后你会得到2940176892的正确答案。