Преобразование шестнадцатеричной строки в двоичную строку - PullRequest
12 голосов
/ 27 декабря 2011

Я хотел бы преобразовать шестнадцатеричную строку в двоичную строку. Например, Hex 2 - 0010. Ниже приведен код:

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

Однако это работает только для Hex 0 - 9; он не будет работать для Hex A - F, потому что он использует int. Кто-нибудь может улучшить его?

Ответы [ 6 ]

27 голосов
/ 27 декабря 2011

Вы должны указать Java, что int находится в шестнадцатеричном виде, например:

String hexToBinary(String hex) {
    int i = Integer.parseInt(hex, 16);
    String bin = Integer.toBinaryString(i);
    return bin;
}
14 голосов
/ 27 декабря 2013

принятая версия будет работать только для 32-битных чисел.

Вот версия, которая работает для произвольно длинных шестнадцатеричных строк:

public static String hexToBinary(String hex) {
    return new BigInteger(hex, 16).toString(2);
}
6 голосов
/ 27 декабря 2011

Вам нужно использовать другой метод Integer.parseInt () .

Integer.parseInt(hex, 16);
5 голосов
/ 11 января 2014

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

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

}

4 голосов
/ 18 января 2017

Принятый ответ работает только для 32-битных значений, а альтернативная версия BigInteger усекает ведущие нули в двоичной строке!Вот функция, которая должна работать во всех случаях.

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;
}
1 голос
/ 09 февраля 2018
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;
}

Извините, было немного поздно. Но, тем не менее, я думаю, что мой ответ самый прямой и простой.

С уважением, Юнь Ханьсюань 09.02.2018

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...