Java十六进制到十进制的转换不正确

Java十六进制到十进制的转换不正确,java,arrays,hex,decimal,Java,Arrays,Hex,Decimal,我最近遇到了这个问题,每当我为我的hexToDecimal()方法输入一个值时,它总是输出一些随机值,而这些值根本不是输入值的转换。例如,如果我输入ABC,它将输出cccc。我相信使用hexVal的switch case语句可能有问题,但我不知道如何着手解决它。以下是方法本身: public static void hexToDecimal() { System.out.println("Enter your hexadecimal number (in uppercase)");

我最近遇到了这个问题,每当我为我的
hexToDecimal()
方法输入一个值时,它总是输出一些随机值,而这些值根本不是输入值的转换。例如,如果我输入
ABC
,它将输出
cccc
。我相信使用
hexVal
的switch case语句可能有问题,但我不知道如何着手解决它。以下是方法本身:

public static void hexToDecimal() {

    System.out.println("Enter your hexadecimal number (in uppercase)");
    numHexadecimal = input.next();
    hexArray = numHexadecimal.toCharArray();

    for (int i = 0; i < hexArray.length; i ++) {
        switch (hexArray [i]) {
        case 'G': case 'H': case 'I': case 'J': case 'K':
        case 'L': case 'M': case 'N': case 'O': case 'P':
        case 'Q': case 'R': case 'S': case 'T': case 'U':
        case 'V': case 'W': case 'X': case 'Y': case 'Z':
            System.out.println("Enter a valid number!"); 
            numHexadecimal = input.next(); 
            hexArray = numHexadecimal.toCharArray(); break;
        default: break;
    }

    int intNum = Integer.valueOf(numHexadecimal, 16);

    int digit;
    digit = intNum % 16;

    switch (digit) {
        case 15: hexVal+="F"; break;
        case 14: hexVal+="E"; break;
        case 13: hexVal+="D"; break;
        case 12: hexVal+="C"; break;
        case 11: hexVal+="B"; break;
        case 10: hexVal+="A"; break;
        case 9:  hexVal+="9"; break;
        case 8:  hexVal+="8"; break;
        case 7:  hexVal+="7"; break;
        case 6:  hexVal+="6"; break;
        case 5:  hexVal+="5"; break;
        case 4:  hexVal+="4"; break;
        case 3:  hexVal+="3"; break;
        case 2:  hexVal+="2"; break;
        case 1:  hexVal+="1"; break;
        case 0:  hexVal+="0"; break;
        default: hexVal+=Integer.toString(digit);          
    }

    intNum = intNum/16;

    for (int j = hexVal.length()-1; j >= 0; j--)
        System.out.print(hexVal.charAt(j));
    }

}
publicstaticvoid hexToDecimal(){
System.out.println(“输入十六进制数字(大写)”;
numHexadecimal=input.next();
hexArray=numHexadecimal.toCharArray();
for(int i=0;i=0;j--)
系统输出打印(hexVal.charAt(j));
}
}

您当前的实现相当大,并且使用了大量重复代码。我建议将其压缩并利用一些内置系统在十六进制和整数之间进行转换。如下所示:

public static void main(String[] args) {
    String sampleHex = "83ABC";
    int val = hexToDecimal(sampleHex);
    System.out.println("Value: " + val);
}

private static int hexToDecimal(String value) {
    //Store the valid characters for easy referencing
    char[] validCharacters = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    //Remove white space and make sure all alphabet characters are upper case
    char[] digits = value.strip().toUpperCase().toCharArray();

    //Leverage a named loop to move on to the next digit when determined valid
    outerLoop:
    for(char digit : digits) {
        for(char valid : validCharacters) {
            if(digit == valid)
              continue outerLoop;
        }
        //The character wasn't in your valid list, so declare an error and return a value of -1
        System.out.println("Invalid character given.");
        return -1;
    }
    //Use the built in library tools to convert the value
    return Integer.parseInt(value, 16);
}

正如Tim Hunter所说,Java已经具备了这种能力。 但是,如果您想编写自己的,这里有一个版本使用更少的内置系统调用

   public static int hexToDecimal(String s) {
      int ans = 0;
      String str = s.toLowerCase();
      for (int i = 0; i < s.length(); i++) {
         ans *= 16;
         char c = str.charAt(i);
         if ( (c >= '0') && (c <= '9')) {
            ans += c - '0';
         } else {
            switch (c) {
            case 'a':
            case 'b':
            case 'c':
            case 'd':
            case 'e':
            case 'f':
               ans += 10 + c - 'a';
               break;
            default:
               // TODO: handle format error
               break;
            }
         }
      }
      return ans;
   }

这可以通过从右到左而不是从左到右的方式来改进,以帮助避免大值的溢出问题,就像使用long而不是int一样。

我看到的主要问题是switch语句的滥用。在每个块之后,您应该使用break语句,否则控制流将传递到下一个实例。Java内置了在十六进制和十进制之间转换的系统。要从十六进制转换为十进制,可以使用
Integer.parseInt(stringValue,16)
。有关本指南的更多详细信息,请访问:
   ans *= 16;
   ans += Character.digit( c, 16 );