java.lang.NumberFormatException:值超出范围。值:“8C”Radix:16 从 String 转换为 byte[]

java.lang.NumberFormatException: Value out of range. Value:"8C" Radix:16 while converting from String to byte[]

从以下代码中获取以下错误。我想要实现的是将一系列十六进制代码作为字节本身打印到文件中。我该如何修复它,以便我可以在文件中打印 8C

public static void process() {
    System.out.println("File to print");
    String hexString = "418C";
    try {
        byte value[] = getByte(hexString);
        try (FileOutputStream outputStream = new FileOutputStream(filePath)) {
            outputStream.write(value);
        }
    } catch (Exception exp) {
        exp.printStackTrace();
    }
}
    
private static byte[] getByte(String str) {
    byte[] val = new byte[str.length() / 2];
    for (int i = 0; i < val.length; i++) {
        int index = i * 2;
        byte byt = Byte.parseByte(str.substring(index, index + 2), 16);
        val[i] = byt;
    }
    return val;
}

异常

java.lang.NumberFormatException: Value out of range. Value:"8C" Radix:16
    at java.base/java.lang.Byte.parseByte(Byte.java:154)

基于下面的link,我改成了Character.MAX_RADIX,但是又报错了。 https://www.tutorialspoint.com/java/lang/byte_parsebyte_radix.htm

以下link 很有帮助 Why does Byte.parseByte("80", 16) fail?

Byte.parseByte(str, 16) 需要签名输入。比如可以写Byte.parseByte("-1", 16),因为-1适合Java,byte不适合Byte.parseByte("80", 16),因为128不适合Byte.parseByte("80", 16) Java byte 类型。

您可以将 Byte.parseByte(str.substring(index, index + 2), 16) 替换为 (byte) Integer.parseInt(str.substring(index, index + 2), 16),这样就可以了。

如果您使用的是 Java 17,则可以使用 java.util.HexFormat.of().parseHex(hexString) 而不是 getByte(hexString)

您可以使用 int 将其转换并截断为 8 位长度。查看 getByte 中进行转换的两行。

public class Temp {

    public static void process() {
        System.out.println("File to print");
        String hexString = "418C";
            byte value[] = getByte(hexString);

            for(byte v: value) {
                
                System.out.printf("v: %2x\t", v);
            }
    }

    private static byte[] getByte(String str) {
        byte[] val = new byte[str.length() / 2];
        for (int i = 0; i < val.length; i++) {
            int index = i * 2;
            
            int byt = Integer.parseInt(str.substring(index, index + 2), 16);
            val[i] = (byte) (byt & 0xff);

        }
        return val;
    }

    public static void main(String[] args) {
        process();
    }
}

输出为

File to print
v: 41   v: 8c