web-dev-qa-db-fra.com

Conversion de chaîne binaire en chaîne hexadécimale JAVA

Je veux convertir mon binaire (qui est dans la chaîne) en chaîne hexadécimale également, ceci est juste un fragment de programme puisque ce programme est juste une partie d'un autre programme plus grand:

//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

le problème est que je ne sais pas si le remplissage fonctionne, mais je suis sûr que ce programme retourne une mauvaise conversion hexadécimale de la chaîne binaire que j'essaie de faire: 

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

PS: je dois l'implémenter (sans utiliser aucune fonction intégrée)

7
dumas

Si vous n'avez pas à implémenter cette conversion vous-même, vous pouvez utiliser le code existant:

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

Si vous devez l'implémenter vous-même, votre code pose plusieurs problèmes:

  1. La boucle doit itérer de 0 à binary.length () - 1 (en supposant que le premier caractère de la chaîne représente le bit le plus significatif).
  2. Vous supposez implicitement que votre chaîne binaire a 4 * x caractères pour un entier x. Si ce n'est pas vrai, votre algorithme casse. Vous devriez laisser votre chaîne avec des zéros pour obtenir une chaîne d'une telle longueur.
  3. sum doit être remis à 0 après chaque chiffre hexadécimal que vous avez généré.
  4. System.out.print(digitNumber); - ici, vous devez imprimer sum et non pas digitNumber.

Voici à quoi ressemble le code principalement fixe:

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

Sortie:

7AA

Cela ne fonctionnera que si le nombre de chiffres binaires est divisible par 4. Vous devez donc ajouter un remplissage 0 gauche comme étape préliminaire.

23
Eran

Vous pouvez essayer quelque chose comme ça. 

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

J'espère que cela aide: D

2
Amit.D

Avec un nombre binaire donné 01011011, nous le convertirons d'abord en nombre décimal, chaque nombre sera Math.pow() par décrémentation:

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 + 1

= 91 (forme décimale du nombre binaire)

Maintenant, après avoir obtenu un nombre décimal, nous devons le convertir en nombre décimal.

Donc, 91 est supérieur à 16. Donc, nous devons diviser par 16.

Après avoir divisé par 16, le quotient est 5 et le reste est 11.

Le reste est inférieur à 16.

Le nombre hexadécimal du reste est B.

Le quotient est 5 et le nombre hexadécimal du reste est B.

Soit 91 = 16 × 5 +11 =B

5 = 16 × 0 + 5 = 5

= 5B

La mise en oeuvre:

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');
}
0
user6490462

/* * Pour modifier cet en-tête de licence, choisissez En-têtes de licence dans les propriétés du projet . * Pour modifier ce fichier de modèle, choisissez Outils | Modèles * et ouvrez le modèle dans l'éditeur . */ package stringprocessing;

/** * * @author Zayeed Chowdhury */ public class StringProcessing {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
    int index = 0;
    String bin = "0000000101100101011011100110011100000001000000000000000010101010010101100110010101100011011010010110110101100001001000000100111001100101011101000111011101101111011100100110101101110011001000000100100001000001010100110010000001001001010100110101001101010101010001010100010000100000010000010010000001010010010001010101000101010101010010010101001001000101010001000010000001010111010001010100010101001011010011000101100100100000010101000100010101010011010101000010000001000110010011110101001000100000010101000100100001000101001000000100011001001111010011000100110001001111010101110100100101001110010001110010000001000011010011110101010101001110010101000100100101000101010100110010111101000001010100100100010101000001010100110011101000100000010100000110100101101110011000010110110000101100001000000100000101011010001110110010000001000001010101000010000000000001111000000011000100110010001110100011000100110011001000000101000001001101001000000100111101001110";
    String[] hexString = new String[bin.length() / 4];
    for (int i = 0; i < bin.length() / 4; i++) {
        hexString[i] = "";
        for (int j = index; j < index + 4; j++) {
            hexString[i] += bin.charAt(j);
        }
        index += 4;
    }

    for (int i = 0; i < bin.length() / 4; i++) {
        System.out.print(hexString[i] + " ");
    }

    System.out.println("\n" + bin.length());
    String[] result = binaryToHex(hexString);

    for (int i = 0; i < result.length; i++) {
        System.out.print("" + result[i].toUpperCase());
    }
    System.out.println("");
}

public static String[] binaryToHex(String[] bin) {
    String[] result = new String[bin.length];
    for (int i = 0; i < bin.length; i++) {
        result[i] = Integer.toHexString(Integer.parseInt(bin[i], 2));
    }
    //return Integer.toHexString(Integer.parseInt(bin[0], 2));
    return result;
}

}

0
Zayeed A. Chowdhury

Utilisez ceci pour toute longueur de chaîne binaire:

String hexString = new BigInteger(binaryString, 2).toString(16);
0
Benvorth
 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
rayan