我不确定导致此异常的原因,并且堆栈跟踪没有帮助,因为它表明它是由未知来源引起的。
下面的方法采用两个十六进制字符串,一个表示操作码,一个表示操作数,并在连接它们并将它们添加到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;
}
答案 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, 伽