在Java中使用循环和开关将二进制转换为十六进制

在Java中使用循环和开关将二进制转换为十六进制,java,Java,我需要使用循环和开关op来进行转换。在做出这些改变之后。我得到二进制1111110的结果,作为F,然后在下一行得到E。我怎样才能解决这个问题?我不想使用stringbuilder,因为我还没有学会。还有其他简单的代码吗?字符串是不可变的 public static void main(String[] args) { Scanner ms = new Scanner(System.in); String binary = ms.nextLine(); binary=b

我需要使用循环和开关op来进行转换。在做出这些改变之后。我得到二进制1111110的结果,作为F,然后在下一行得到E。我怎样才能解决这个问题?我不想使用stringbuilder,因为我还没有学会。还有其他简单的代码吗?

字符串是不可变的

public static void main(String[] args) {

    Scanner ms = new Scanner(System.in);

    String binary = ms.nextLine();
    binary=binary.trim();

    //add leading zeroes if length divided by 4 has remainder.
    while (binary.length() % 4 != 0) binary = "0" + binary;

    String number = "";
    for (int i = 0; i < binary.length(); i += 4) {
       String num = binary.substring(i, i + 3);

       switch(num)
        {
            case "0000" : number = "0"; break;
            case "0001" : number = "1"; break;
            case "0010" : number = "2"; break;
            case "0011" : number = "3"; break;
            case "0100" : number = "4"; break;
            case "0101" : number = "5"; break;
            case "0110" : number = "6"; break;
            case "0111" : number = "7"; break;
            case "1000" : number = "8"; break;
            case "1001" : number = "9"; break;
            case "1010" : number = "A"; break;
            case "1011" : number = "B"; break;
            case "1100" : number = "C"; break;
            case "1101" : number = "D"; break;
            case "1110" : number = "E"; break;
            case "1111" : number = "F"; break;

        }
         System.out.println(number);
    }
}
此外,您还需要从索引0到3,而不是从0到4获取字符串。所以是i,i+3

所以在这里应该是:

binary = binary.trim(); //not just binary.trim();
另外,去掉底部的return语句,因为它在执行一次迭代时退出方法

您的return语句在for循环中,因此在第一次迭代后,您将从函数返回。而且,您每次都会覆盖数字。您应该用StringBuilder和user append替换数字


另外,其他人也注意到,您的binary.trim不能按预期工作,它需要是binary=binary.trim。

您的代码的直接问题是您在打印第一个数字后立即返回!删除报税表,它也会打印其他数字

另外,正如Josh所指出的,您必须执行binary=binary.trim;,as trim不会在适当位置更改字符串,而是返回字符串的修剪版本

最后,请注意,您可以用以下代码替换大部分代码

public static void main(String[] args) {

    Scanner ms = new Scanner(System.in);

    String binary = ms.nextLine();
    binary.trim();

    //add leading zeroes if length divided by 4 has remainder.
    while (binary.length() % 4 != 0) binary = "0" + binary;

    StringBuilder number = new StringBuilder();
    for (int i = 0; i < binary.length(); i += 4) {
       String num = binary.substring(i, i + 4);

       switch(num)
        {
            case "0000" : number.append("0"); break;
            case "0001" : number.append("1"); break;
            case "0010" : number.append("2"); break;
            case "0011" : number.append("3"); break;
            case "0100" : number.append("4"); break;
            case "0101" : number.append("5"); break;
            case "0110" : number.append("6"); break;
            case "0111" : number.append("7"); break;
            case "1000" : number.append("8"); break;
            case "1001" : number.append("9"); break;
            case "1010" : number.append("A"); break;
            case "1011" : number.append("B"); break;
            case "1100" : number.append("C"); break;
            case "1101" : number.append("D"); break;
            case "1110" : number.append("E"); break;
            case "1111" : number.append("F"); break;
        }             
        System.out.println(number.toString());
    }
    return;
}
这是因为您从循环的第一次迭代返回

不管怎样,这里有一段代码,它可以实现您想要的功能,将二进制字符串转换为十六进制

它还可以保存switch语句


只需将二进制字符串值传递给它,它就会无缝工作:D

当您在第一次迭代后返回时,您的循环根本没有效果。此外,字符串是不可变的。binary.trim绝对没有效果。您需要执行binary=binary.trim。为什么不改为使用int-decimal=Integer.parseIntbinary,2;字符串十六进制=整数。ToString十六进制,16;如果您必须自己实现,请遵循以下答案。或:System.out.printlnInteger.toBinaryStringn;
public static void main(String[] args) {

    Scanner ms = new Scanner(System.in);

    String binary = ms.nextLine();
    binary.trim();

    //add leading zeroes if length divided by 4 has remainder.
    while (binary.length() % 4 != 0) binary = "0" + binary;

    StringBuilder number = new StringBuilder();
    for (int i = 0; i < binary.length(); i += 4) {
       String num = binary.substring(i, i + 4);

       switch(num)
        {
            case "0000" : number.append("0"); break;
            case "0001" : number.append("1"); break;
            case "0010" : number.append("2"); break;
            case "0011" : number.append("3"); break;
            case "0100" : number.append("4"); break;
            case "0101" : number.append("5"); break;
            case "0110" : number.append("6"); break;
            case "0111" : number.append("7"); break;
            case "1000" : number.append("8"); break;
            case "1001" : number.append("9"); break;
            case "1010" : number.append("A"); break;
            case "1011" : number.append("B"); break;
            case "1100" : number.append("C"); break;
            case "1101" : number.append("D"); break;
            case "1110" : number.append("E"); break;
            case "1111" : number.append("F"); break;
        }             
        System.out.println(number.toString());
    }
    return;
}
int n = Integer.parseInt(binary, 2);
String s = Integer.toString(n, 16);
System.out.println(s.toUpperCase());
static String binToHex(String binStr){
    while(binStr.length() % 4 != 0){
        binStr = "0" + binStr;
    }
    String hexString = "";
    binStr = new StringBuilder(binStr).reverse().toString();
    for(int index = 0, len = binStr.length(); index < len;){
        int num = 0;
        for(int indexInQuad = 0; indexInQuad < 4; indexInQuad++, index++){
            int bit=Integer.parseInt(String.valueOf(binStr.charAt(index)));
            num += (bit * Math.pow(2,indexInQuad));
        }
        hexString += Integer.toHexString(num).toUpperCase();
    }
    hexString = new StringBuilder(hexString).reverse().toString();
    return hexString;
}