import java.util.*;
import java.io.*;
public class Main
{
    public static void main(String[] args) 
    {
        int digitNumber=1;
        int sum = 0;
        String binary = "1110101011111010";
        String hex;
        for(int i = 0; i < binary.length(); i++)
        {
        if(digitNumber == 1)
            sum += Integer.parseInt(binary.charAt(i) + "")*128;
        else if (digitNumber == 2)
            sum += Integer.parseInt(binary.charAt(i) + "")*64;
        else if (digitNumber == 3)
            sum += Integer.parseInt(binary.charAt(i) + "")*32;
        else if (digitNumber == 4)
            sum += Integer.parseInt(binary.charAt(i) + "")*16;
        else if (digitNumber == 5)
            sum += Integer.parseInt(binary.charAt(i) + "")*8;
        else if (digitNumber == 6)
            sum += Integer.parseInt(binary.charAt(i) + "")*4;
        else if (digitNumber == 7)
            sum += Integer.parseInt(binary.charAt(i) + "")*2;
        else if (digitNumber == 8)
        {
            sum += Integer.parseInt(binary.charAt(i) + "")*1;
            hex = Integer.toString(sum,16);
            System.out.print(hex);
        }
        else if (digitNumber == 9)
        {
            digitNumber = 1;
            sum=0;
        }
        digitNumber++;
            
        }
    }
}

Salut à tous, j'essaye de convertir une chaîne de binaire en hexadécimal. Ma chaîne binaire est "1110101011111010". La sortie doit être EAFA, mais ma sortie est EA7A. Qu'est ce qui ne va pas avec mon code? Est-ce que quelqu'un peut m'aider s'il vous plaît?

1
allen nguyen 27 sept. 2020 à 11:06

5 réponses

Meilleure réponse

Au cas où vous attendez un long string, vous pouvez utiliser BigInteger pour convertir toute chaîne binaire en hexadécimal.

public static String convertBinaryToHexadecimal(String binaryStr) {
    return new BigInteger(binaryStr, 2).toString(16);
}

Sortie:

BigInteger num = BigInteger.valueOf(Long.MAX_VALUE);
String binaryStr = num.add(num).toString(2);                // 2 times bigger than long
System.out.println(convertBinaryToHexadecimal(binaryStr));  // fffffffffffffffe

public static String convertHexadecimalToBinary(String hexadecimalStr, int length) {
    return String.format("%0" + length + 'd', new BigInteger(new BigInteger(hexadecimalStr, 16).toString(2)));
}

Sortie:

String hexadecimalStr = "7B";
System.out.println(convertHexadecimalToBinary(hexadecimalStr, 8));  // 01111011
1
oleg.cherednik 28 sept. 2020 à 07:46

Le problème réel dans votre code est que dans le cas de digitNumber == 9, vous définissez digitNumber sur 1 puis l'incrémentez, mais vous n'analysez pas ce chiffre, vous sautez donc le premier bit de le deuxième octet que vous analysez.

L'approche recommandée serait de passer à Integer.parseInt(binary, 2), Long.parseLong(binary, 2) ou même new BigInteger(binary, 2).

Cependant, si vous souhaitez corriger votre code, vous devez déplacer la vérification de digitNumber == 9 au début de la boucle, et indépendamment des autres instructions if, donc:

for(int i = 0; i < binary.length(); i++) {
    if (digitNumber == 9) {
        digitNumber = 1;
        sum=0;
    }

    if(digitNumber == 1)
        sum += Integer.parseInt(binary.charAt(i) + "")*128;
    else
    // rest of your if...
    digitNumber++;
}
1
Mark Rotteveel 27 sept. 2020 à 08:31

Je pense que vous avez trop de code.

Essaye ça:

String hex = Long.toHexString(Long.parseLong(binary, 2)); // handles up to 63 bits

Rappelez-vous: plus vous avez de code, plus il y a d'endroits où les bogues se cachent.

1
Bohemian 27 sept. 2020 à 08:20

J'ai utilisé une approche de base pour convertir une chaîne binaire en hexadécimal, veuillez trouver ci-dessous:

public class StringToHexaDecmal {

    // Driver program to test above function
    public static void main(String[] args) {
        String num = new String("1110101011111010");
        int decValue = binaryToDecimal(num);
        stringToHexadecimal(decValue);
    }

    // Function to convert binary to decimal
    static int binaryToDecimal(String n) {
        String num = n;
        int dec_value = 0;

        // Initializing base value to 1,
        // i.e 2^0
        int base = 1;

        int len = num.length();
        for (int i = len - 1; i >= 0; i--) {
            if (num.charAt(i) == '1')
                dec_value += base;
            base = base * 2;
        }

        return dec_value;
    }

    // Function to convert decimal value to Hexadecimal
    private static void stringToHexadecimal(int no) {
        // TODO Auto-generated method stub
        String hexadecimalNo = "";
        char c;
        while (no != 0) {
            int rem = no % 16;
            if (rem > 9 && rem <= 15) {
                c = (char)(rem + 55);
                hexadecimalNo = c + hexadecimalNo;
            }
            if (rem < 10) {
                hexadecimalNo = rem + hexadecimalNo;
            }

            no = no / 16;

        }
        System.out.println(hexadecimalNo);
    }
}
0
Mikheil Zhghenti 27 sept. 2020 à 12:34

Il est certainement plus simple d'utiliser les fonctions intégrées comme @ Bohemian ♦ l'a fait. Mais si vous avez vraiment besoin / souhaitez effectuer la conversion binaire manuellement, vous pouvez modifier votre boucle for comme suit:

for (int i = 0; i < binary.length(); i++) {
    sum += Integer.parseInt(binary.charAt(binary.length() - i - 1) + "") * (1 << i);
}

Cela parcourt la chaîne binaire de droite à gauche. 1 << i équivaut à Math.pow(2, i).

0
jdaz 27 sept. 2020 à 08:25