繁体   English   中英

为什么我可以将8位十六进制解析为Long,并将其转换为Integer,但不能直接解析为Integer?

[英]Why can I parse an 8 digit hex into a Long, and convert it to an Integer, but not parse as an Integer directly?

我正在尝试使用ColorDrawable(int color) 该类只有一个int构造函数。 通常,你可以这样做:

ColorDrawable(0xFF8E8F8A)

但由于我的颜色是字符串(6个十六进制数字,没有alpha),我必须这样做:

Long color = Long.parseLong("FF"+hexColorString, 16); // hexColorString like "8E8F8A"
ColorDrawable drawable = new ColorDrawable(color.intValue());

为什么Integer.parseInt("FF"+hexColorString, 16)只返回一个负数(有效无符号)int,而不是抛出NumberFormatException

编辑:我的问题更简洁的版本:

为什么Long.parseLong("FF"+hexColorString, 16).intValue()Integer.parseInt("FF"+hexColorString, 16)返回相同的值? 前者有效,但后者给了我一个例外。

编辑:无论如何我没有得到正确的颜色,所以我切换到以下方法:

ColorDrawable drawable = new ColorDrawable(Color.parseColor("#FF"+hexColorString));

0xFF8E8F8A的值> Integer.MAX_VALUE

由于没有溢出或下溢按设计抛出Exception ,因此它会将您的值解释为Integer.MIN_VALUE ,因为Integer.MAX_VALUE + 1会转换为Integer.MIN_VALUE

因此, Long.intValue会将值转换int ,其中给定值为Integer.MAX_VALUE + x ,其中x > 0 ,将从Integer.MIN_VALUE ,即Integer.MIN_VALUE + x

但是,来自Integer javadoc:

如果发生以下任何一种情况,则抛出NumberFormatException类型的异常:

第一个参数为null或者是长度为零的字符串。 [...]字符串表示的值不是int类型的值。

0xFF8E8F8A不是int类型,因此是NumberFormatException

作为旁注,我很确定ColorDrawable构造函数接受一个int因为它需要一个id而不是颜色的数字表示,但说实话,文档并不十分清楚。

在此处查看R.color文档。

最后的注释 - 在这一点上归功于OP

您可以使用new ColorDrawable(Color.parseColor(yourHexString))来获得更方便的方法。

因为0xFF8E8F8A超出整数范围。 0xFF8E8F8A == 4287532938 ,它大于Integer.MAX_VALUE

假设0xFF8E8F8A等于-7434358 (通过Long解析时得到的值)不正确,因为您可以解析负十六进制值:

Integer.parseInt("-717076", 16);

所以-0x717076等于-7434358 ,无符号表示为0xFF8E8F8A

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM