2014-09-05 3 views
0

10 진수, 2 진수 및 16 진수로 변환하는 프로그램을 작성하고 있습니다. 프로그램이 컴파일되지만 16 진수로 바이너리를 입력하려고하면 "java.lang.StringIndexOutOfBoundsException : String index of range : 34"예외가 발생합니다. 이것이 첫 번째 문제입니다. 두 번째 문제는 16 진수에서 2 진수로 변환하면 다소 길어지고 (잘못된) 반환이된다는 것입니다. 두 가지 코드를 모두 포함했습니다. 올바른 방향으로 조금 움직여 주시면 대단히 감사하겠습니다.16 진수에서 16 진수로 이진수로 변환

진수로 진 :

/** 
* Method that converts a binary number to its hexadecimal equivalent. 
* @param no parameters 
* @return returns void 
*/ 
public void binToHex() 
{ 

    System.out.println("The binary number you enter will be converted to its hexidecimal equivalent."); 

    System.out.println("Please enter a binary number: "); 

    Scanner keyboard = new Scanner(System.in); 

    String bin = keyboard.nextLine(); 

    String oldbin = bin; 

    bin = bin.replace(" ", "").trim(); 

    StringBuffer hex = new StringBuffer("00000000000000000000000000000000"); 

    //String hex1 = ""; 

    int j = 0; 

    for (int i = 0; i < bin.length(); i++) 
    { 

     if (bin.substring(i, i+4).equals("0000")) 
     { 

      hex.setCharAt(j, '0'); 
     } 

     else if (bin.substring(i, i+4).equals("0001")) 
     { 

      hex.setCharAt(j, '1'); 
     } 

     else if (bin.substring(i, i+4).equals("0010")) 
     { 

      hex.setCharAt(j, '2'); 
     } 

     else if (bin.substring(i, i+4).equals("0011")) 
     { 

      hex.setCharAt(j, '3'); 
     } 

     else if (bin.substring(i, i+4).equals("0100")) 
     { 

      hex.setCharAt(j, '4'); 
     } 

     else if (bin.substring(i, i+4).equals("0101")) 
     { 

      hex.setCharAt(j, '5'); 
     } 

     else if (bin.substring(i, i+4).equals("0110")) 
     { 

      hex.setCharAt(j, '6'); 
     } 

     else if (bin.substring(i, i+4).equals("0111")) 
     { 

      hex.setCharAt(j, '7'); 
     } 

     else if (bin.substring(i, i+4).equals("1000")) 
     { 

      hex.setCharAt(j, '8'); 
     } 

     else if (bin.substring(i, i+4).equals("1001")) 
     { 

      hex.setCharAt(j, '9'); 
     } 

     else if (bin.substring(i, i+4).equals("1010")) 
     { 

      hex.setCharAt(j, 'A'); 
     } 

     else if (bin.substring(i, i+4).equals("1011")) 
     { 

      hex.setCharAt(j, 'B'); 
     } 

     else if (bin.substring(i, i+4).equals("1100")) 
     { 

      hex.setCharAt(j, 'C'); 
     } 

     else if (bin.substring(i, i+4).equals("1101")) 
     { 

      hex.setCharAt(j, 'D'); 
     } 

     else if (bin.substring(i, i+4).equals("1110")) 
     { 

      hex.setCharAt(j, 'E'); 
     } 

     else if(bin.substring(i, i+4).equals("1111")) 
     { 

      hex.setCharAt(j, 'F'); 
     } 

     i = i + 4; 

     j = j + 1; 
    } 

    System.out.println("The binary number you entered, " + oldbin + " is " + hex + " in hexadecimal.\n"); 

    pw.print("The binary number you entered, " + oldbin + " is " + hex + " in hexadecimal.\n"); 
} 

}

진수 바이너리 :

/** 
* Method that converts a hexadecimal number to its binary equivalent. 
* @param no parameters 
* @return returns void 
*/ 
public void hexToBin() 
{ 

    System.out.println("The hexadecimal number you enter will be convered to its binary equivalent."); 

    System.out.println("Please enter a hexadecimal number: "); 

    Scanner keyboard = new Scanner(System.in); 

    String bin = keyboard.nextLine(); 

    bin = bin.trim(); 

    String binary = ""; 

    for (int i = 0; i < bin.length(); i++) 
    { 

     if(bin.charAt(i) == '0') 
     { 

      binary = binary.concat("0000"); 
     } 

     else if(bin.charAt(i) == '1') 
     { 

      binary = binary.concat("0001"); 
     } 

     else if(bin.charAt(i) == '2') 
     { 

      binary = binary.concat("0010"); 
     } 

     else if(bin.charAt(i) == '3') 
     { 

      binary = binary.concat("0011"); 
     } 

     else if(bin.charAt(i) == '4') 
     { 

      binary = binary.concat("0100"); 
     } 

     else if(bin.charAt(i) == '5') 
     { 

      binary = binary.concat("0101"); 
     } 

     else if(bin.charAt(i) == '6') 
     { 

      binary = binary.concat("0110"); 
     } 

     else if(bin.charAt(i) == '7') 
     { 

      binary = binary.concat("0111"); 
     } 

     else if(bin.charAt(i) == '8') 
     { 

      binary = binary.concat("1000"); 
     } 

     else if(bin.charAt(i) == '9') 
     { 

      binary = binary.concat("1001"); 
     } 

     else if(bin.charAt(i) == 'A'); 
     { 

      binary = binary.concat("1010"); 
     } 

     if(bin.charAt(i) == 'B'); 
     { 

      binary = binary.concat("1011"); 
     } 

     if(bin.charAt(i) == 'C'); 
     { 

      binary = binary.concat("1100"); 
     } 

     if(bin.charAt(i) == 'D'); 
     { 

      binary = binary.concat("1101"); 
     } 

     if(bin.charAt(i) == 'E'); 
     { 

      binary = binary.concat("1110"); 
     } 

     if(bin.charAt(i) == 'F'); 
     { 

      binary = binary.concat("1111"); 
     } 
    } 

    System.out.println("The hexadecimal you entered, " + bin + " is " + binary + " in binary.\n"); 

    pw.print("The hexadecimal you entered, " + bin + " is " + binary + " in binary.\n"); 
} 

}

+1

왜 ['toBinaryString()'(http://docs.oracle.com/javase/7를 사용하지 /docs/api/java/lang/Integer.html#toBinaryString%28int%29), ['toHexString()'] (http://docs.oracle.com/javase/7/docs/api/java/lang/) Integer.html # toHexString % 28int % 29) 및 ['parseInt()'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt%28java. lang.String, % 20int % 29)가 기수를 사용합니까? –

+0

'A'사례로 시작하여 'else if'조건 바로 다음에 추가 세미콜론이 있어야합니다. – rgettman

+0

이것은 과제를위한 것이며 자바의 내장 라이브러리 함수를 사용하여 변환 작업을 수행 할 수 없습니다. – user3727648

답변

1

binToHex에서 :

T 그는 첫 번째 문제는 bin.substring(i, i+4)에서 ibin.length()-1으로 높기 때문에 i+4이 범위를 벗어날 수 있다는 것입니다.

두 번째 문제는 바이너리 문자열이 4로 나눌 수 있는지 모른다는 것입니다. 그렇게하려면 0으로 채우셔야합니다.

for (int i = 0; i < bin.length(); i+=4)

그런 다음 bin.substring(i, i+4)가 범위 외에 없을 것 : 왼쪽 패딩을 한 후

, 당신은에 루프를 변경할 수 있습니다.

편집 : 각 반복의 끝에서 4 씩 증가시키는 것으로 나타났습니다. 그러나 for 루프에서 i를 1 씩 늘리므로 각 반복마다 5 씩 증가시킵니다.

StringBuffer 대신 StringBuilder를 사용하는 것이 좋습니다 (스레드 안전성이 필요하지 않음). 그리고 문자를 추가하려면 append 메서드를 사용하십시오. 두 번째 메소드에는 String.concat을 사용하지 마십시오. StringBuilder를 사용하십시오.

hexToBin에서 :

당신은 당신의 if의 일부 이전 else을 잊어 버렸습니다. 그리고 당신이 가진 것은 ";" 일부 조건 이후. 예를 들어

는 : if(bin.charAt(i) == 'B');

이 해당 조건을 다음과 같은 코드가 항상 실행된다는 의미입니다. (난 아직도 대신하여 StringBuilder를 사용하는 것이 좋습니다하지만)

올바른 구현은 다음과 같습니다

if(bin.charAt(i) == '0') 
    { 

     binary = binary.concat("0000"); 
    } 

    else if(bin.charAt(i) == '1') 
    { 

     binary = binary.concat("0001"); 
    } 

    else if(bin.charAt(i) == '2') 
    { 

     binary = binary.concat("0010"); 
    } 

    else if(bin.charAt(i) == '3') 
    { 

     binary = binary.concat("0011"); 
    } 

    else if(bin.charAt(i) == '4') 
    { 

     binary = binary.concat("0100"); 
    } 

    else if(bin.charAt(i) == '5') 
    { 

     binary = binary.concat("0101"); 
    } 

    else if(bin.charAt(i) == '6') 
    { 

     binary = binary.concat("0110"); 
    } 

    else if(bin.charAt(i) == '7') 
    { 

     binary = binary.concat("0111"); 
    } 

    else if(bin.charAt(i) == '8') 
    { 

     binary = binary.concat("1000"); 
    } 

    else if(bin.charAt(i) == '9') 
    { 

     binary = binary.concat("1001"); 
    } 

    else if(bin.charAt(i) == 'A') 
    { 

     binary = binary.concat("1010"); 
    } 

    else if(bin.charAt(i) == 'B') 
    { 

     binary = binary.concat("1011"); 
    } 

    else if(bin.charAt(i) == 'C') 
    { 

     binary = binary.concat("1100"); 
    } 

    else if(bin.charAt(i) == 'D') 
    { 

     binary = binary.concat("1101"); 
    } 

    else if(bin.charAt(i) == 'E') 
    { 

     binary = binary.concat("1110"); 
    } 

    else if(bin.charAt(i) == 'F') 
    { 

     binary = binary.concat("1111"); 
    } 
+0

16 진수에서 2 진수로 변환하는 것은 어떻습니까? 왜 내 출력이 거의 3 줄 길어? 고맙습니다! – user3727648

+0

@ user3727648 입력 한 내용과 출력 내용을 표시하면 도움이됩니다. – Eran

+0

입력 한 16 진수는 해당하는 2 진수로 변환됩니다. 입력 한 16 진수, 12345678 바이너리에 00011010101111001101111011110010101010111100110111101111001110101011110011011110111101001010101111001101111011110101101010111100110111101111011010101011110011011110111101111010101111001101111011111000101010111100110111101111입니다 : 는 16 진수를 입력하십시오. – user3727648

관련 문제