将字符串二进制转换为十六进制

时间:2020-09-27 08:06:21

标签: java

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

大家好,我正在尝试将Binary String转换为Hexadecimal。我的字符串二进制是“ 1110101011111010”。输出应为EAFA,但我的输出为EA7A。 我的代码有什么问题?有人可以帮我吗?

5 个答案:

答案 0 :(得分:1)

我认为您的代码太多。

尝试一下:

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

请记住:您拥有的代码越多,存在的漏洞就越多。

答案 1 :(得分:1)

您的代码中的实际问题是,在digitNumber == 9的情况下,您将digitNumber设置为1,然后对其进行了递增,但是您没有解析该数字,因此跳过了您要解析的第二个字节的第一位。

推荐的方法是切换为使用Integer.parseInt(binary, 2)Long.parseLong(binary, 2)甚至是new BigInteger(binary, 2)

但是,如果要修复代码,则需要将digitNumber == 9的检查移到循环的开始,并且独立于其他if语句,因此:

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

答案 2 :(得分:1)

如果您希望使用长string,则可以使用BigInteger将任何二进制字符串转换为十六进制。

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

输出:

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

输出:

String hexadecimalStr = "7B";
System.out.println(convertHexadecimalToBinary(hexadecimalStr, 8));  // 01111011

答案 3 :(得分:0)

使用像@ Bohemian♦这样的内置函数无疑是最容易的。但是,如果您确实需要/想要手动执行二进制转换,则可以将for循环更改为以下内容:

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

这从右到左循环遍历二进制字符串。 1 << i等同于Math.pow(2, i)

答案 4 :(得分:0)

我使用了将字符串二进制转换为十六进制的基本方法,请在下面找到:

byte[] sizeAr = new byte[4];
int num = inputStream.read();
sizeAr = ByteBuffer.allocate(4).putInt(num).array();
int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get();