将十六进制字符串转换为 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 标准库中完成。

提前谢谢你的帮助。

225088 次浏览

它对于 int (4字节,带有符号)来说太大了。

使用

Long.parseLong("AA0F245C", 16);

JavaInteger可以处理的最大值是2147483657,即2 ^ 31-1。十六进制数 AA0F245C 作为十进制数是2853119068,而且太大了,所以需要使用

Long.parseLong("AA0F245C", 16);

才能成功。

可以通过使用带有 format 参数的 parseInt 轻松实现。

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

Javadoc 整数

你可以这样使用

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

这是正确的答案:

MyPasseColor = “ # ffff8c85” Int = Color.parseColor (myPasseColor)

对于那些需要将有符号字节的十六进制表示从两个字符的字符串转换为字节(在 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)。所以你需要朗来储存它。在转换为负数并转换回整数之后,它将适合。没有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。正如其他答案所示,转换为字节数组是一个选项,而在 Java 中经常被遗忘的类 BigInterger也是一个选项。

String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266

试试这个:

Long abc = ConvertString2Hex (“1A2A3B”) ;

private  long  convertString2Hex(String numberHexString)
{
char[] ChaArray = numberHexString.toCharArray();
long HexSum=0;
long cChar =0;


for(int i=0;i<numberHexString.length();i++ )
{
if( (ChaArray[i]>='0') && (ChaArray[i]<='9') )
cChar = ChaArray[i] - '0';
else
cChar = ChaArray[i]-'A'+10;
HexSum = 16 * HexSum + cChar;
}
return  HexSum;
}