如何将十六进制颜色字符串解析为整数

Posted

技术标签:

【中文标题】如何将十六进制颜色字符串解析为整数【英文标题】:How to parse hex color String to Integer 【发布时间】:2012-08-29 10:46:35 【问题描述】:

我正在编写 Robolectric 中的一些代码,即IntegerResourceLoader。当rawValue0xFFFF0000 之类的东西时,以下方法会抛出 RuntimeException

@Override
public Object convertRawValue( String rawValue ) 
    try 
        return Integer.parseInt( rawValue );
     catch ( NumberFormatException nfe ) 
        throw new RuntimeException( rawValue + " is not an integer." );
    

我尝试使用 Integer.decode(String),但即使语法似乎正确,也会引发 NumberFormatException。

【问题讨论】:

【参考方案1】:

decode() 是正确的调用方法,但它失败了,因为 0xFFFF0000 高于整数的 0x7fffffff 最大限制。您可能需要考虑 Long。

【讨论】:

【参考方案2】:

rawValue0xFFFF0000 之类的东西时,以下方法会抛出RuntimeException

这是因为 Integer.parseInt 不是为处理 0x 前缀而设计的。

我尝试使用 Integer.decode(String),但即使语法似乎正确,也会引发 NumberFormatException。

来自Integer.decodeJavadoc(链接在您的问题中):

此字符序列必须表示正值,否则将引发 NumberFormatException。

0xFFFF0000 是一个负数,因此这很可能是导致此处抛出异常的原因。

解决方案:

如果您知道给定的值将采用0x[hexdigits] 的形式,那么您可以使用采用基数的Integer.parseInt(String, int)。对于十六进制,基数是 16。像这样:

return Integer.parseInt(rawValue.split("[x|X]")[1], 16);

这使用正则表达式[x|X] 来拆分字符串,这将在小写或大写“x”字符上分隔rawValue,然后将其传递给基数为16 的parseInt 进行解析它是十六进制的。

【讨论】:

如果您知道它是 0x,则不需要使用 split(每次转换颜色时都会编译一个正则表达式),而是可以使用 O(1) 操作:parseInt(rawValue.substring(2))。 Java 字符串针对substring 进行了优化(请参阅java.lang.String 中的offsetcount 字段) 那行不通。我尝试过这个。 java.lang.NumberFormatException: Invalid int: "98E91E63" whre 98 是 Alpha @sud007 我的解决方案要求字符串是“0x98E91E63”,否则你可以使用Integer.parseInt("98E91E63", 16)来解析整数。 @Brian 我试过同样的Integer.parseInt("98E91E63", 16) 不起作用!【参考方案3】:

这就是android的做法:

private int parseColor(String colorString) 
    if (colorString.charAt(0) == '#') 
        // Use a long to avoid rollovers on #ffXXXXXX
        long color = Long.parseLong(colorString.substring(1), 16);
        if (colorString.length() == 7) 
            // Set the alpha value
            color |= 0x00000000ff000000;
         else if (colorString.length() != 9) 
            throw new IllegalArgumentException("Unknown color");
        
        return (int)color;
    
    throw new IllegalArgumentException("Unknown color");

【讨论】:

【参考方案4】:

如果你可以去掉前面的 0x,那么你可以设置 parseInt() 的基数。所以Integer.parseInt(myHexValue,16)

更多信息请参见http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#parseInt(java.lang.String, int)

【讨论】:

以上是关于如何将十六进制颜色字符串解析为整数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中将颜色整数转换为十六进制字符串?

ActionScript 3 AS3将十六进制颜色(整数)转换为CSS颜色(字符串)

如何在 C++ 中将 RGB 颜色值转换为十六进制值?

如何将字符串转换为 html 颜色代码哈希?

如何将字符串颜色转换为其十六进制代码或 RGB 值?

使用正则将十六进制颜色值解析为rgb三通道