首页 文章

将十六进制字符串转换为int

提问于
浏览
91

我试图将一个长度为8个字符的十六进制代码的字符串转换为一个整数,以便我可以在很多不同的值上进行int比较而不是字符串比较 .

我知道这在C中相当简单,但我需要用Java来完成 . 我需要满足的测试用例主要是将“AA0F245C”转换为int然后再返回到该字符串,以便我知道它正在转换 .

我尝试过以下方法:

int decode = Integer.decode("0xAA0F245C");  // NumberFormatException
int decode2 = Integer.decode("AA0F245C"); //NumberFormatException
int parseInt = Integer.parseInt("AA0F245C", 16); //NumberFormatException
int valueOf = Integer.valueOf("AA0F245C", 16); //NumberFormatException

我也尝试过一次两个字符并将结果相乘,转换有效,但数字不正确 .

int id = 0;
for (int h = 0; h < hex.length(); h= h+2)
{
    String sub = hex.subSequence(h, h+2).toString();

if (id == 0)
    id = Integer.valueOf(sub, 16);
else
    id *= Integer.valueOf(sub, 16);             
 }
//ID = 8445600 which = 80DEA0 if I convert it back.

我不能只使用第三方库,因此必须在Java标准库中完成 .

提前谢谢你的帮助 .

6 回答

  • 5

    这是正确的答案:

    myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)

  • 15

    你可以使用parseInt和format参数轻松完成 .

    Integer.parseInt("-FF", 16) ; // returns -255
    

    javadoc Integer

  • 2

    你可以这样用

    System.out.println(Integer.decode("0x4d2"))    // output 1234
    //and vice versa 
    System.out.println(Integer.toHexString(1234); //  output is 4d2);
    
  • 131

    Java Integer 可以处理的最大值是2147483657,或2 ^ 31-1 . 十六进制数AA0F245C是一个十进制数字2853119068,太大了,所以你需要使用

    Long.parseLong("AA0F245C", 16);
    

    使它工作 .

  • 21

    它对于一个int来说太大了(这是4个字节并签名) .

    使用

    Long.parseLong("AA0F245C", 16);
    
  • 3

    对于那些需要将有符号字节的十六进制表示从双字符串转换为字节(在Java中始终是有符号的)的人,有一个例子 . 解析十六进制字符串永远不会给出负数,这是错误的,因为从某些角度来看0xFF是-1(二进制补码编码) . 原理是将传入的String解析为int(大于byte),然后回绕负数 . 我只显示字节,因此该示例足够短 .

    String inputTwoCharHex="FE"; //whatever your microcontroller data is
    
    int i=Integer.parseInt(inputTwoCharHex,16);
    //negative numbers is i now look like 128...255
    
    // shortly i>=128
    if (i>=Integer.parseInt("80",16)){
    
        //need to wrap-around negative numbers
        //we know that FF is 255 which is -1
        //and FE is 254 which is -2 and so on
        i=-1-Integer.parseInt("FF",16)+i;
        //shortly i=-256+i;
    }
    byte b=(byte)i;
    //b is now surely between -128 and +127
    

    可以对其进行编辑以处理更长的数字 . 只需添加更多FF或00 . 对于解析8个十六进制字符有符号整数,需要使用Long.parseLong,因为FFFF-FFFF(整数-1)在表示为正数时不适合Integer(给出4294967295) . 所以你需要Long来存储它 . 转换为负数并转回Integer后,它将适合 . 没有8个字符的十六进制字符串,最终不适合整数 .

相关问题