【问题标题】:Java fails to parse a hex string as an intJava 无法将十六进制字符串解析为 int
【发布时间】:2015-11-23 08:09:33
【问题描述】:

谁能告诉我为什么这段代码会抛出异常?

int value = 0xabcdef01;
System.out.println(value);                 // prints -1412567295
String hex = Integer.toHexString(value);
System.out.println(hex);                   // prints abcdef01
// why does this line fail?
Integer.parseInt(hex, 16);  

此代码引发以下异常:

java.lang.NumberFormatException: For input string: "abcdef01"
  at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
  at java.lang.Integer.parseInt(Integer.java:583)

我正在使用以下 JDK 在 Windows 7 上运行

java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

【问题讨论】:

标签: java integer hex numberformatexception


【解决方案1】:

您对不返回自身的整数的困惑与 toHexString() 的特性有关,它返回“abcdef01”而不是“-543210ff”,它真正代表了您的原始整数。运行这个看看:

  int value = -0x543210ff;
  assert(value == 0xabcdef01);
  assert(value == Integer.parseInt("-543210ff", 16));

【讨论】:

  • 不知道 java 对十六进制字符串使用了负号指示符,谢谢
【解决方案2】:

当您使用 Java 8 时,请考虑 Integer.parseUnsignedInt 方法:

Integer.parseUnsignedInt(hex, 16);  

【讨论】:

  • 感谢这解决了我的问题,我假设 Integer.parseInt(..., 16) 将处理表示负 int 值的十六进制
【解决方案3】:

也许你想要的是

 int num = (int) Long.parseLong(hex, 16);  

问题是数字 >= 0x8000_0000 太大而无法存储在int

【讨论】:

  • 我对低级数存储的理解欠缺,但是Java int是32位的,我的hex值也不过如此?
  • Long 解析例程也将其转换为正 long 值,而实际上应该是负 int 值
  • @cyber-monk 实际上你的数字远远超过了这个数字,还记得整数可以是负数吗?这意味着您实际上只能获得 31 位来表示您的正数。这有效地将最大值减半。
  • @Peter,我以为 java 会为我处理这个符号并将其转换为负 int 值
猜你喜欢
  • 2016-07-17
  • 2015-08-02
  • 1970-01-01
  • 2011-08-09
  • 2012-04-27
  • 2013-02-01
  • 2017-05-29
  • 1970-01-01
  • 2019-01-30
相关资源
最近更新 更多