繁体   English   中英

java-字符串十六进制到字符串二进制转换器

[英]java - String Hex to String Binary converter

//convert hexadecimal to binary using BigInt
public static String hexToBinary(String hexNumber)
{
    //BigInteger temp = new BigInteger(hexNumber, 16);
    //return temp.toString(2);
        String s = hexNumber;
        byte[] bytes = s.getBytes();
        StringBuilder binary = new StringBuilder();
        for (byte b : bytes)
        {
            int val = b;
            for (int i = 0; i < 8; i++)
            {
                binary.append((val & 128) == 0 ? 0 : 1);
                val <<= 1;
            }
            binary.append(' ');
        }
        System.out.println("'" + s + "' to binary: " + binary);
        return binary.toString();
}

字符串hexNumber为“ 0957”,该函数返回“ 00110000 00111001 00110101 00110111” ...我期望的是“ 0000 1001 0101 0111”。 有人可以找出问题所在吗? 谢谢。

您正在将字符“ 0”,“ 9”,“ 5”,“ 7”的数值转换为二进制,而不是转换实际数字。 例如,数值'0'为48,这就是为什么您打印的第一个字节为00110000

在将每个字符转换为位之前,需要从每个字符中减去48(或“ 0”),并且还要记住,每个十六进制字符都可以用4位表示,但是循环为每个字符打印8位。 实际上,只有在您的输入没有A到F的十六进制数字时才有效(您必须从A到F的十六进制数字中减去('A' - 10)才能将它们转换为10到15的数字)。

这是一种方法(仍然缺少对数字“ A”至“ F”的处理,但适用于示例输入):

    byte[] bytes = s.getBytes();
    StringBuilder binary = new StringBuilder();
    for (byte b : bytes)
    {
        int val = b - '0';
        val <<= 4;
        for (int i = 0; i < 4; i++)
        {
            binary.append((val & 128) == 0 ? 0 : 1);
            val <<= 1;
        }
        binary.append(' ');
    }
    System.out.println("'" + s + "' to binary: " + binary);

输出:

'0957' to binary: 0000 1001 0101 0111 

这有两种方法:

public class Snippet {
    public static String hexToBinary1(String hexNumber)
    {
        int v = Integer.parseInt(hexNumber, 16);
        String s = Integer.toString(v, 2); 
        int pad = hexNumber.length()*4-s.length();
        for (int i=0; i<pad; i++) {
            s="0"+s;
        }
        return s;
    }

    public static String hexToBinary2(String hexNum) {
        StringBuilder sb = new StringBuilder();
        for (int i=0; i<hexNum.length(); i++) {
            int v = Character.digit(hexNum.charAt(i), 16);
            String padded = String.format("%4s",  Integer.toString(v, 2)).replace(' ', '0');
            sb.append(padded);
        }
        return sb.toString();
    }

    public static void main(String[] arjgs) {
        System.out.println(hexToBinary1("0957"));
        System.out.println(hexToBinary2("0957"));
    }
}

两者都将打印出0000100101010111。

String char  binary number
"0" → 0x0030 → 0000 0000 0011 0000
"1" → 0x0031 → 0000 0000 0011 0001
"2" → 0x0032 → 0000 0000 0011 0010
 :
"9" → 0x0039 → 0000 0000 0011 1001
"A" → 0x0041 → 0000 0000 0100 0001
"B" → 0x0042 → 0000 0000 0100 0010
 :
"F" → 0x0046 → 0000 0000 0100 0110

http://www.tamasoft.co.jp/en/general-info/unicode.html

public static String hexToBinary1(String hexNumber) {

    StringBuilder binary = new StringBuilder();

    for (int i = 0; i < str.length(); i++) {

        char ch = str.charAt(i);
        int val;

        if(ch >= '0' && ch <= '9') {
            val = (int)ch - 0x30;
        else if(ch >= 'A' && ch <= 'F') {
            val = (int)ch - 0x41 + 0x0A;
        }

        for (int i = 0; i < 4; i++) {
            binary.append((val & 16) == 0 ? 0 : 1);
            val <<= 1;
        }
        binary.append(' ');
    }

    System.out.println("'" + s + "' to binary: " + binary);
    return binary.toString();
}

要么

public static String hexToBinary1(String hexNumber) {
    return String.format("%16s", Integer.toBinaryString(Integer.parseInt(hexNumber, 16))).replace(" ", "0");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM