将十六进制字符串转换为二进制时导致的奇怪的StringIndexOutofBoundsException

时间:2018-02-22 18:36:06

标签: java

我不确定导致此异常的原因,并且堆栈跟踪没有帮助,因为它表明它是由未知来源引起的。

下面的方法采用两个十六进制字符串,一个表示操作码,一个表示操作数,并在连接它们并将它们添加到arraylist之前将它们转换为二进制。很简单。为了确保每个二进制字符串包含完整的8位我正在使用一个名为hexToBinary的小实用程序方法,出于某种原因,当我尝试使用此方法转换我的十六进制字符串时,它会导致异常。

从asmLine对象中获取的操作码和操作数在下面给出了以下输入:

A9 10
90 C6
0A 00
11 FF
38 00
7D FF
81 FF
A1 09
AA 00
20 11
58 00
6C 09
FE 10

所有上述十六进制值都应转换为二进制。但这不会发生。奇怪的是,当我明确说明要通过实用方法转换的十六进制值时,正如我对行String beginBinary = Utils.hexToBinary("FA");所做的那样完全正常工作。当我使用从asmLine对象中提取的值时,我无法理解为什么这不起作用。

public void constructBinaryOutput()
    {
        ArrayList<String> binaryOut = new ArrayList<String>();

        String beginBinary = Utils.hexToBinary("FA"); //This works normally
        String endBinary = Utils.hexToBinary("FF");  //This works normally

        String twoByteString = beginBinary.concat(" " + beginBinary);

        binaryOut.add(twoByteString);

        for(AssemblyLine asmLine : lineObjects)
        {
            String opcodeHex = asmLine.getOpcodeHEX();
            String operandHex = asmLine.getOperandHEX();

            System.out.println("Hex opcode/operand: " + opcodeHex + " " + operandHex);

            String opcodeBinary = Utils.hexToBinary(opcodeHex); //This causes an exception
            String operandBinary = Utils.hexToBinary(operandHex); 

            System.out.println("Hex opcode " + asmLine.getOpcodeHEX() + " converted into binary " + opcodeBinary);
            System.out.println("Hex operand " + asmLine.getOperandHEX() + " converted into binary " + operandBinary);

            twoByteString = opcodeBinary.concat(" " + operandBinary);

            System.out.println("2 Byte instruction: " + twoByteString);

            binaryOut.add(twoByteString);
        }
}

效用方法hexToBinary

public static String hexToBinary(String hex)
{
    String bin = Integer.toBinaryString(Integer.parseInt(hex,16));
    int length = bin.length();
    return length == 8 ? bin : "00000000".substring(length - 8) + bin;
}

1 个答案:

答案 0 :(得分:0)

你的util函数中只是一个简单的错误。它应该是:

public static String hexToBinary(String hex) {
        String bin = Integer.toBinaryString(Integer.parseInt(hex, 16));
        int length = bin.length();
        return length == 8 ? bin : "00000000".substring(length) + bin;
}

注意子字符串。

HTH, 伽