【问题标题】:Java: How to turn Hex into int?Java:如何将十六进制转换为整数?
【发布时间】:2015-04-04 16:06:20
【问题描述】:

我正在使用BufferedImage(在 PNG 中)并想用另一种颜色替换一种颜色。 我将所有颜色都存储为字符串以便于处理,但是...

for(int x=0;x<output.getWidth();x++)
    for(int y=0;y<output.getHeight();y++)
        if(output.getRGB(x,y)==Integer.parseInt("ffff00fe",16))
            output.setRGB(x,y,Integer.parseInt("ffaaaaaa",16));

结果整数应该是负数,但它会抛出NumberFormatException

当我执行output.getRGB(x,y) 时,它会在不透明像素上返回负数

【问题讨论】:

  • Convert hex string to int 的可能重复项
  • 这些字符串是否来自外部来源?因为如果不是,只需使用十六进制文字 0xffff00fe0xffaaaaaa
  • 即使没有,除非字符串每次都在循环中发生变化,否则最好将转换提升到循环之外。 (JIT 可能足够聪明,可以做到这一点,但我不会指望这一点。)如果您想查看这些像素的正(无符号)值,您也可以使用 Integer.toUnsignedString(output.getRGB(x, y))Integer.toUnsignedString(output.getRGB(x, y), 16).
  • 0xffff00fe is 解释为 32 位 int 时为负数。有什么问题?

标签: java numberformatexception parseint


【解决方案1】:

你可以的

int number = (int)Long.parseLong("ffff00fe", 16);

【讨论】:

  • 这很尴尬,上次我尝试了它没有用,但现在它可以了,谢谢
【解决方案2】:

数字 2,147,483,647(或十六进制 7FFFFFFF)是 32 位带符号二进制 整数 的最大正值。您要转换的内容几乎是其两倍,这意味着二进制数的第一位是 1;在有符号二进制整数中,第一位为 1 表示它是负数。

基本上,您需要更大的东西来解析它。 试试(int) Long.parseLong("ffff00fe", 16) 而不是Integer.parseInt("ffff00fe",16)

【讨论】:

    【解决方案3】:

    大于0x7fff_ffff 的值太大而无法作为有符号ints. 处理Java 8 添加了处理ints 的方法,就好像它们包含无符号值一样。只需将parseInt 替换为parseUnsignedInt:

    Integer.parseUnsignedInt("ffaaaaaa", 16)
    

    如果您需要使用 Java 7 及更早版本,可以将其解析为 long,然后将其转换为 int. 或者,如果值是常量,则可以将它们写为数字常量,例如 @987654329 @ 甚至 0xffaa_aaaa 并避免处理字符串转换(数字中的下划线从 Java 7 开始是允许的,并且可以使它们更易于阅读)。

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 2012-03-08
      • 2014-04-16
      • 2015-04-30
      • 2023-03-13
      • 2016-12-04
      相关资源
      最近更新 更多