在java中从十六进制转换为整数

问题描述 投票:0回答:3

由于以下代码行,我收到错误:

int x = color(Integer.parseInt("ffffffde",16));

我想这可能是因为它是负值

有什么想法为什么或如何或如何解决它吗?

编辑:

抱歉,没有包含实际错误。这是:

例外情况 线程“动画线程”java.lang.NumberFormatException:对于输入 字符串:“ffffffde”位于 java.lang.NumberFormatException.forInputString(来源未知) java.lang.Integer.parseInt(来源未知)

编辑2:

值(“ffffffde”)由以下代码创建:

Integer.toHexString(int_val);

编辑3: 事实证明这是一个已知的错误(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4215269) 虽然您可以将整数转换为十六进制字符串,但如果它们是负数,则无法将它们转换回来!!

java hex int
3个回答
12
投票

ffffffde
大于整数最大值

Java int 是 32 位有符号类型,范围从 –2,147,483,648 到 2,147,483,647。

ffffffde = 4,294,967,262 

编辑

您使用

Integer.toHexString(int_val)
将 int 转换为十六进制字符串。来自该方法的文档:

以 16 为基数的 unsigned 整数形式返回整数参数的字符串表示形式。

但是

int
是一个signed类型。

使用

int value = new BigInteger("ffffffde", 16).intValue();

将其恢复为负值。


5
投票

如果您遇到这样的错误,

Exception in thread "main" java.lang.NumberFormatException: For input string: "ffffffde"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:461)
    at com.TestStatic.main(TestStatic.java:22)

那么您传递的值存在问题,即 ffffffde 。这不是解析为 int 的有效十六进制值。

请尝试这个

int x = Integer.parseInt("ffffde",16);
        System.out.println(x);

应该可以。

对于超过此值的十六进制值,您必须解析为 Long

Long x = Long.parseLong("ffffffde",16);
        System.out.println(x);

这也应该有效


0
投票

使用 Java 8 中引入的

Integer.parseUnsignedInt
方法而不是
Integer.parseInt
将产生所需的行为。

int x = color(Integer.parseUnsignedInt("ffffffde", 16));

问题是

Integer.toHexString
返回一个以 16 为基数的无符号整数,但
Integer.parseInt
将该值解析为有符号整数。由于
ffffffde
作为有符号整数大于
Integer.MAX_VALUE
,因此会抛出观察到的
NumberFormatException

Integer.toHexString
Javadocs 表示
parseUnsignedInt
可用于将
String
转换回
int
:

可以通过调用

s
从返回的字符串
Integer.parseUnsignedInt(s, 16)
中恢复参数的值。

© www.soinside.com 2019 - 2024. All rights reserved.