Java шестнадцатеричные и десятичные неверные преобразования - PullRequest
0 голосов
/ 30 января 2020

У меня недавно была эта проблема, когда всякий раз, когда я вводил значение для моего метода hexToDecimal(), он всегда выводил некоторые случайные значения, которые вообще не являются преобразованием для введенного значения. Например, если бы я набрал ABC, он бы вывел CCCCCC. Я полагаю, что это может быть проблемой в операторе switch switch с hexVal, но я не знаю, как go узнать и исправить это. Вот сам метод ниже:

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));
    }

}

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Как сказал Тим Хантер, 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;
   }

Тело для l oop может быть уменьшено до

   ans *= 16;
   ans += Character.digit( c, 16 );

Это можно улучшить, работая справа налево, а не слева направо, чтобы избежать проблем с переполнением для больших значений, как при использовании long вместо int.

0 голосов
/ 30 января 2020

Ваша текущая реализация довольно большая и использует много повторяющегося кода. Я бы рекомендовал сжать его и использовать некоторые встроенные системы для преобразования между шестнадцатеричным и целым числами. Примерно так:

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);
}
...