2011-12-27 3 views
11

Je souhaite convertir une chaîne hexadécimale en chaîne binaire. Par exemple, Hex 2 est 0010. Ci-dessous le code:Conversion d'une chaîne hexadécimale en chaîne binaire

String HexToBinary(String Hex) 
{ 
    int i = Integer.parseInt(Hex); 
    String Bin = Integer.toBinaryString(i); 
    return Bin; 
} 

Cependant, cela ne fonctionne que pour les Hex 0 - 9; il ne fonctionnera pas pour Hex A - F car il utilise int. Quelqu'un peut-il l'améliorer?

+0

juste pour vous faire (et d'autres utilisateurs) connaissez, convention java vous dit devriez commencer à partir de minuscules pour les noms de variables. par exemple. Hex, devrait être hex, et Bin, devrait être bin. – planty182

Répondre

25

Vous devez dire Java que l'int est en hexadécimal, comme ceci:

String hexToBinary(String hex) { 
    int i = Integer.parseInt(hex, 16); 
    String bin = Integer.toBinaryString(i); 
    return bin; 
} 
+2

merci .................. – user871695

+0

ne sera pas wokr pour une valeur de chaîne hexagonale énorme –

+0

@KaveeshKanwal Cela devrait n'est pas surprenant, car OP utilise des entiers, n'est-ce pas? – dasblinkenlight

9

la version acceptée ne fonctionne que pour 32 numéros de bits.

est ici une version qui fonctionne pour les chaînes hexagonales arbitrairement longues:

public static String hexToBinary(String hex) { 
    return new BigInteger(hex, 16).toString(2); 
} 
+0

il ajoute des bits supplémentaires –

5

Voici quelques routines que j'ai écrit pour manipuler hex, texte brut, et binaire, ils espèrent aider. Depuis que j'ai emprunté des idées à ces fils, je pensais partager.

public static String zero_pad_bin_char(String bin_char){ 
    int len = bin_char.length(); 
    if(len == 8) return bin_char; 
    String zero_pad = "0"; 
    for(int i=1;i<8-len;i++) zero_pad = zero_pad + "0"; 
    return zero_pad + bin_char; 
} 
public static String plaintext_to_binary(String pt){ 
    return hex_to_binary(plaintext_to_hex(pt)); 
} 
public static String binary_to_plaintext(String bin){ 
    return hex_to_plaintext(binary_to_hex(bin)); 
} 
public static String plaintext_to_hex(String pt) { 
    String hex = ""; 
    for(int i=0;i<pt.length();i++){ 
     String hex_char = Integer.toHexString(pt.charAt(i)); 
     if(i==0) hex = hex_char; 
     else hex = hex + hex_char; 
    } 
    return hex; 
} 
public static String binary_to_hex(String binary) { 
    String hex = ""; 
    String hex_char; 
    int len = binary.length()/8; 
    for(int i=0;i<len;i++){ 
     String bin_char = binary.substring(8*i,8*i+8); 
     int conv_int = Integer.parseInt(bin_char,2); 
     hex_char = Integer.toHexString(conv_int); 
     if(i==0) hex = hex_char; 
     else hex = hex+hex_char; 
    } 
    return hex; 
} 
public static String hex_to_binary(String hex) { 
    String hex_char,bin_char,binary; 
    binary = ""; 
    int len = hex.length()/2; 
    for(int i=0;i<len;i++){ 
     hex_char = hex.substring(2*i,2*i+2); 
     int conv_int = Integer.parseInt(hex_char,16); 
     bin_char = Integer.toBinaryString(conv_int); 
     bin_char = zero_pad_bin_char(bin_char); 
     if(i==0) binary = bin_char; 
     else binary = binary+bin_char; 
     //out.printf("%s %s\n", hex_char,bin_char); 
    } 
    return binary; 
} 
public static String hex_to_plaintext(String hex) { 
    String hex_char; 
    StringBuilder plaintext = new StringBuilder(); 
    char pt_char; 
    int len = hex.length()/2; 
    for(int i=0;i<len;i++){ 
     hex_char = hex.substring(2*i,2*i+2); 
     pt_char = (char)Integer.parseInt(hex_char,16); 
     plaintext.append(pt_char); 
     //out.printf("%s %s\n", hex_char,bin_char); 
    } 
    return plaintext.toString(); 
} 

}

3

La réponse acceptée ne fonctionne que pour les valeurs 32 bits et la version alternative BigInteger tronque des zéros en tête dans la chaîne binaire! Voici une fonction qui devrait fonctionner dans tous les cas.

public static String hexToBinary(String hex) { 
    int len = hex.length() * 4; 
    String bin = new BigInteger(hex, 16).toString(2); 

    //left pad the string result with 0s if converting to BigInteger removes them. 
    if(bin.length() < len){ 
     int diff = len - bin.length(); 
     String pad = ""; 
     for(int i = 0; i < diff; ++i){ 
      pad = pad.concat("0"); 
     } 
     bin = pad.concat(bin); 
    } 
    return bin; 
} 
+0

il ajoute des bits supplémentaires –

0
private static Map<String, String> digiMap= new HashMap<>(); 
static { 
    digiMap.put("0", "0000"); 
    digiMap.put("1", "0001"); 
    digiMap.put("2", "0010"); 
digiMap.put("3", "0011"); 
digiMap.put("4", "0100"); 
digiMap.put("5", "0101"); 
digiMap.put("6", "0110"); 
digiMap.put("7", "0111"); 
digiMap.put("8", "1000"); 
digiMap.put("9", "1001"); 
digiMap.put("A", "1010"); 
digiMap.put("B", "1011"); 
digiMap.put("C", "1100"); 
digiMap.put("D", "1101"); 
digiMap.put("E", "1110"); 
digiMap.put("F", "1111"); 

}

static String hexToBin(String s) { 
    char[] hex=s.toCharArray(); 
    String binaryString=""; 
    for(char h : hex){ 
     binaryString=binaryString+ digiMap.get(String.valueOf(h)); 
    } 

    return binaryString; 
} 

Désolé, il a été un peu en retard. Mais encore, je pense que ma réponse est la plus directe et la plus simple.

Cordialement, YUN Hanxuan 09.02.2018

Questions connexes