当前位置: 首页 > 知识库问答 >
问题:

JAVAlang.NumberFormatException:值超出范围。值:“8C”基数:16,从字符串转换为字节[]

曹奇文
2023-03-14

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

基于以下链接,我改为Character。最大基数,但得到另一个错误。https://www.tutorialspoint.com/java/lang/byte_parsebyte_radix.htm

下面的链接很有帮助,它解释了为什么字节是空的。解析字节(“80”,16)失败?

共有2个答案

尤博达
2023-03-14

您可以使用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   
须景辉
2023-03-14

字节。parseByte(str,16)需要有符号的输入。您可以写入字节。例如,parseByte(“-1”,16),因为-1适合Javabyte类型,但不适合byte。parseByte(“80”,16),因为128不适合Javabyte类型。

您可以替换字节。parseByte(str.substring(index,index 2),16)(byte)整数。parseInt(str.substring(index,index 2),16),它可以正常工作。

如果使用Java17,可以使用java.util.HexFormat.of(). parseHex(hexString)而不是getByte(hexString)

 类似资料:
  • 问题内容: 因此,我正在编写一个简单的程序来输入字符串并计算总数。的米 所以,这是我的代码 where 和str是我接受过的字符串,但是此错误不断出现 这是什么错误以及如何将其删除? 问题答案: 字符串,有效索引从0到n-1; 更改 至

  • 问题内容: 我猜我正在收到此错误,因为字符串正在尝试对值进行子字符串化。但是那部分不能消除这个问题吗? 这是Java代码段: 我收到此错误: 问题答案: 我猜我正在收到此错误,因为字符串试图将Null值作为子字符串。但是“ .length()> 0”部分不能消除该问题吗? 不,在itemdescription为null时调用itemdescription.length()不会生成StringInd

  • 问题内容: 嗨,我编写了Java代码来查找由其他单词组成的最长单词。我的逻辑是从文本文件中读取单词列表,并将每个单词添加到一个数组中(在文本中,单词被排序,并且每行中只有一个单词)之后,我们检查数组中的每个元素是否具有其他元素作为子字符串。如果是这样,我们计算子字符串的数量。具有最大子串数的元素将是结果 当我给一个只有两个单词的文本文件时,代码正在运行。但是,当有两个以上的单词时,我将出现以下错误

  • 问题内容: 我正在编写一个打开文本文件并检查注释的程序。然后,它解析注释以检查某些单词。 错误im出现在以下while循环中,该循环检查是否当前行以空格或除’/’以外的其他字符开头,如果那里存在非反斜杠字符,则while循环移至下一行并检查再次。一旦while循环满足其要求并中断程序崩溃,我将收到以下输出错误。 这是有问题的代码示例 谢谢你的帮助。我确定这是一个简单的错误,但我只是看不到它。 问题

  • 问题内容: 退货 我需要这些值是int类型而不是string类型。有没有比用foreach遍历数组并将每个字符串转换为int更好的方法呢? 问题答案: 您可以通过以下代码来实现,

  • 3. 数值字符串转换函数 #include <stdlib.h> int atoi(const char *nptr); double atof(const char *nptr); 返回值:转换结果 atoi把一个字符串开头可以识别成十进制整数的部分转换成int型,相当于下面要讲的strtol(nptr, (char **) NULL, 10);。例如atoi("123abc")的返回值是12