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