java - java转换十六进制字符串到 int

  显示原文与译文双语对照的内容

我试图将一个长度为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标准库中完成。

感谢你的帮助。

时间:

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

使用


Long.parseLong("AA0F245C", 16);



你可以这样使用。


System.out.println(Integer.decode("0x4d2"))//output 1234


//and vice versa 


System.out.println(Integer.toHexString(1234);//output is 4d2);



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


Long.parseLong("AA0F245C", 16);



使它工作。

你可以使用parseInt格式化参数轻松完成。


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



javadoc整数

这是个正确的答案:

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

对于那些需要将有符号字节的十六进制表示从双字符串转换为字节(在Java中始终是有符号的)的人,有一个例子。 从某种角度来说,解析十六进制字符串永远不会给出负数,因为 0xFF 从某一角度说是 -1的补充。 原则是将传入字符串解析为 int,该字符串大于字节,然后包围负数。 我只显示了字节,所以这个例子足够短。


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. 对于解析为十六进制字符有符号整数,需要使用长字符,因为在表示为正数的整数时不适合整数 -1 ffff整数整数。 所以你需要很长的时间来储存它。 在转换为负数并转回Integer后,它将适合。 没有 8个字符的十六进制字符串,在末尾不适合整数。


//Method for Smaller Number Range:


Integer.parseInt("abc",16);



//Method for Bigger Number Range.


Long.parseLong("abc",16);



//Method for Biggest Number Range.


new BigInteger("abc",16);



建议使用的另外一个选项是使用 BigInteger 类。 由于十六进制值通常是大数值,例如sha256或者sha512值,它们将很容易溢出 intlong 。 和答案一样,转换为字节 array 是一个选项,在Java中经常被遗忘的BigInterger 类也是一个选项。


String sha256 ="65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";


BigInteger value = new BigInteger(sha256, 16);


System.out.println("value =" + value);


//46115947372890196580627454674591875001875183744738980595815219240926424751266



...