【问题标题】:Is this a valid Hex value?这是一个有效的十六进制值吗?
【发布时间】:2021-10-22 20:24:58
【问题描述】:

我正在读取一系列十六进制值,使用代码读取值`0x03B6:

Integer.parseInt("0x03B6",16);

导致异常:

Exception in thread "main" java.lang.NumberFormatException: For input string: "0x03B6"

但是,如果我删除值开头的 0x,则结果将正确转换为 HEX:

Integer.parseInt("03B6",16)

0X 是表示它是十六进制值的约定吗? 03B6 是有效的十六进制?

使用十六进制计算器 - https://www.calculator.net/hex-calculator.html 也无法识别 0x03B6,但可以识别 03B6

【问题讨论】:

  • 0x十六进制文字的前缀。参见here
  • 请注意"0x03B6" 不是十六进制文字;这是一个字符串文字。
  • @RobertHarvey 谢谢,所以我可以从字符串中删除“0x”来解析?
  • 没错。
  • 你读过javadoc吗?

标签: java hex


【解决方案1】:

十六进制数就是03B6。十六进制数字是 0-9 和 A-F,这就是为什么在输入“x”时会出现异常。

在许多语言中,您可以通过添加0x 前缀以十六进制编写常量。这告诉编译器以下数字应该以基数 16 而不是基数 10 解释。10 是 10,0x10 是 16。像 C 这样的一些语言也支持八进制(010 是 8),还有一些其他的支持二进制(0b10 为 2)。 C 是我所知道的最早使用这种 0 前缀思想的语言。

但是,parseInt 方法仅解析数字,因此您必须只提供 03B6,并使用单独的参数来指示基数 16。

【讨论】:

    【解决方案2】:

    通常,它们在编译时被解释。您需要使用Integer.decode。如果省略 0x 前缀,则必须指定 radix 并使用 parseInt

    要使用这些字符串实时解码,请执行以下操作。

    String[] vals = { "0xF", "#111", "0x17C" };
    for (String v : vals) {
        System.out.println(v + " -> " + Integer.decode(v));
    }
    

    打印

    0xF -> 15
    #111 -> 273
    0x17C -> 380
    

    另外,请注意,仅以 0 为前缀的数字将解码为八进制。

    【讨论】:

    • 谢谢,使用解码比 Integer.parseInt("03B6",16);
    猜你喜欢
    • 2016-06-18
    • 2016-08-05
    • 2012-06-17
    • 2016-11-14
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2018-07-16
    相关资源
    最近更新 更多