我试图将一个长度为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是一个十进制数字2853119068,并且太大了,所以你需要使用
Long.parseLong("AA0F245C", 16);
使它工作。
这是正确的答案:
myPassedColor = "#ffff8c85"
int colorInt = Color.parseColor(myPassedColor)
对于那些需要将有符号字节的十六进制表示从双字符串转换为字节(在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个字符的十六进制字符串,最终不适合整数。
//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值,它们很容易溢出int
和long
。虽然转换为字节数组是一个选项,因为其他答案显示,BigInterger
,java中经常被遗忘的类,也是一个选项。
String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266