2014-08-31 3 views
6

Я хочу, чтобы преобразовать мой двоичный (который находится в строке) в шестнадцатеричной строки также, это только фрагмент программы, так как эта программа является частью другой крупной программы:Преобразование двоичной строки в шестнадцатеричную строку JAVA

//the variable name of the binary string is: "binary" 
int digitNumber = 1; 
    int sum = 0; 
    int test = binary.length()%4; 
    if(test!=0) { 
     binary = padLeft(binary, test); 
    } 
    for(int i = 0; i < binary.length(); i++){ 
     if(digitNumber == 1) 
      sum+=Integer.parseInt(binary.charAt(i) + "")*8; 
     else if(digitNumber == 2) 
      sum+=Integer.parseInt(binary.charAt(i) + "")*4; 
     else if(digitNumber == 3) 
      sum+=Integer.parseInt(binary.charAt(i) + "")*2; 
     else if(digitNumber == 4 || i < binary.length()+1){ 
      sum+=Integer.parseInt(binary.charAt(i) + "")*1; 
      digitNumber = 0; 
      if(sum < 10) 
       System.out.print(sum); 
      else if(sum == 10) 
       System.out.print("A"); 
      else if(sum == 11) 
       System.out.print("B"); 
      else if(sum == 12) 
       System.out.print("C"); 
      else if(sum == 13) 
       System.out.print("D"); 
      else if(sum == 14) 
       System.out.print("E"); 
      else if(sum == 15) 
       System.out.print("F"); 
      sum=0; 
     } 
     digitNumber++; 
    } 
    public static String padLeft(String s, int n) { 
     return String.format("%0$"+n+"s", s); 
    }//i added this for padding 

проблема заключается в том, что я не знаю, если обивка работает, но я уверен, что эта программа возвращает неверное преобразование шестнадцатеричных двоичной строки я пытаюсь сделать это:

http://www.wikihow.com/Convert-Binary-to-Hexadecimal

PS: Мне нужно реализовать его (не используя каких-либо встроенных функций)

+0

Причина, по которой вы ничего не видите, заключается в том, что ваше условие цикла (i == 0) не является истинным в начале цикла, поэтому цикл никогда не выполняется. Однако, если вы исправите это, в вашем коде есть много чего другого. –

ответ

18

Если вы не осуществить, что преобразование себя, вы можете использовать существующий код:

int decimal = Integer.parseInt(binaryStr,2); 
String hexStr = Integer.toString(decimal,16); 

Если вы должны реализовать ее самостоятельно , в вашем коде есть несколько проблем:

  1. Петля должна перебираться с 0 на binary.length() - 1 (предполагая, что первый символ строки представляет собой самый старший бит).
  2. Вы неявно предполагаете, что ваша двоичная строка имеет 4 * x charcters для некоторого целого x. Если это не так, ваш алгоритм прерывается. Вы должны оставить ваш String нулями, чтобы получить строку такой длины.
  3. sum должен быть сброшен до 0 после каждой выводимой шестнадцатеричной цифры.
  4. System.out.print(digitNumber); - здесь вы должны напечатать sum, а не digitNumber.

Вот как в основном фиксированный код выглядит:

int digitNumber = 1; 
    int sum = 0; 
    String binary = "011110101010"; 
    for(int i = 0; i < binary.length(); i++){ 
     if(digitNumber == 1) 
      sum+=Integer.parseInt(binary.charAt(i) + "")*8; 
     else if(digitNumber == 2) 
      sum+=Integer.parseInt(binary.charAt(i) + "")*4; 
     else if(digitNumber == 3) 
      sum+=Integer.parseInt(binary.charAt(i) + "")*2; 
     else if(digitNumber == 4 || i < binary.length()+1){ 
      sum+=Integer.parseInt(binary.charAt(i) + "")*1; 
      digitNumber = 0; 
      if(sum < 10) 
       System.out.print(sum); 
      else if(sum == 10) 
       System.out.print("A"); 
      else if(sum == 11) 
       System.out.print("B"); 
      else if(sum == 12) 
       System.out.print("C"); 
      else if(sum == 13) 
       System.out.print("D"); 
      else if(sum == 14) 
       System.out.print("E"); 
      else if(sum == 15) 
       System.out.print("F"); 
      sum=0; 
     } 
     digitNumber++; 
    } 

Выход:

7AA

Это будет работать только тогда, когда число двоичных цифр divisable на 4, так что вы должны добавить левый 0 прокладка как предварительный шаг.

+0

это то, что я пытаюсь сделать http://www.wikihow.com/Convert-Binary-to-Hexadecimal – dumas

+0

@dumas Вы почти правильно поняли, но у вас было несколько ошибок, как упоминалось в моем ответе. – Eran

0

Вы можете попробовать что-то вроде этого.

private void bitsToHexConversion(String bitStream){ 

    int byteLength = 4; 
    int bitStartPos = 0, bitPos = 0; 
    String hexString = ""; 
    int sum = 0; 

    // pad '0' to make input bit stream multiple of 4 

    if(bitStream.length()%4 !=0){ 
     int tempCnt = 0; 
     int tempBit = bitStream.length() % 4;   
     while(tempCnt < (byteLength - tempBit)){ 
      bitStream = "0" + bitStream; 
      tempCnt++; 
     } 
    } 

    // Group 4 bits, and find Hex equivalent 

    while(bitStartPos < bitStream.length()){ 
     while(bitPos < byteLength){ 
      sum = (int) (sum + Integer.parseInt("" + bitStream.charAt(bitStream.length()- bitStartPos -1)) * Math.pow(2, bitPos)) ; 
      bitPos++; 
      bitStartPos++; 
     } 
     if(sum < 10) 
      hexString = Integer.toString(sum) + hexString; 
     else 
      hexString = (char) (sum + 55) + hexString; 

     bitPos = 0; 
     sum = 0; 
    } 
    System.out.println("Hex String > "+ hexString); 
} 

Надеется, что это помогает: D

0
import java.util.*; 
public class BinaryToHexadecimal 
{ 
     public static void main() 
     { 
     Scanner sc=new Scanner(System.in); 
     System.out.println("enter the binary number"); 
     double s=sc.nextDouble(); 
     int c=0; 
     long s1=0; 
     String z=""; 
     while(s>0) 
     { 
      s1=s1+(long)(Math.pow(2,c)*(long)(s%10)); 
      s=(long)s/10; 
      c++; 
     } 
     while(s1>0) 
     { 
      long j=s1%16; 
      if(j==10) 
      { 
       z="A"+z; 
      } 
      else if(j==11) 
      { 
       z="B"+z; 
      } 
      else if(j==12) 
      { 
       z="C"+z; 
      } 
      else if(j==13) 
      { 
       z="D"+z; 
      } 
      else if(j==14) 
      { 
       z="E"+z; 
      } 
      else if(j==15) 
      { 
       z="F"+z; 
      } 
      else 
      { 
       z=j+z; 
      } 
      s1=s1/16; 
     } 
    System.out.println("The respective Hexadecimal number is : "+z); 
    } 
} 
0

По данным двоичного числа 01011011, мы преобразуем его сначала десятичное число, каждое число будет Math.pow() по длине decrementd:

01011011 = (0 × 2 (7)) + (1 × 2 (6)) + (0 × 2 (5)) + (1 × 2 (4)) + (1 × 2 (3)) + (0 × 2 (2)) + (1 × 2 (1)) + (1 × 2 (0))

= (0 × 128) + (1 × 64) + (0 × 32) + (1 × 16) + (1 × 8) + (0 × 4) + (1 × 2) + (1 × 1)

= 0 + 64 + 0 + 16 + 8 + 0 + 2 +-

= 91 (десятичная форма двоичного числа)

Теперь после того, как получить десятичное число мы должны преобразовать его в гекс-десятичный номер.

Так, 91 больше, чем 16. Таким образом, мы должны разделить на 16.

После деления на 16, частное 5 и остаток равен 11.

остаток меньше, чем 16.

шестнадцатеричное число остатка является Б.

частное 5 и шестнадцатеричное число остатка является Б.

То есть, 91 = 16 × 5 = +11 В

5 = 16 × 0 + 5 =

= 5B

Реализация:

String hexValue = binaryToHex(binaryValue); 

    //Display result 
    System.out.println(hexValue); 


private static String binaryToHex(String binary) { 
    int decimalValue = 0; 
    int length = binary.length() - 1; 
    for (int i = 0; i < binary.length(); i++) { 
     decimalValue += Integer.parseInt(binary.charAt(i) + "") * Math.pow(2, length); 
     length--; 
    } 
    return decimalToHex(decimalValue); 
} 
private static String decimalToHex(int decimal){ 
    String hex = ""; 
    while (decimal != 0){ 
     int hexValue = decimal % 16; 
     hex = toHexChar(hexValue) + hex; 
     decimal = decimal/16; 
    } 
    return hex; 
} 

private static char toHexChar(int hexValue) { 
    if (hexValue <= 9 && hexValue >= 0) 
     return (char)(hexValue + '0'); 
    else 
     return (char)(hexValue - 10 + 'A'); 
}