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


111

我正在尝试将十六进制代码长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标准库中完成。

提前谢谢你的帮助。


当您应该转移时,您正在繁殖。
内森·莫因瓦济里

7
0xAA0F245C = 2853119068但是Integer.MAX_VALUE = 0x7fffffff = 2147483647
Pshemo

5
我知道这个问题已经存在两年了。但是,java 8启用了另一个解决方案。他们添加了Integer.parseUnsignedInt("value",radix)适合您目的的方法。如果该值大于Integer.MAX_VALUE它,则将其映射为负数。
约翰

Answers:


151

对于int而言,它太大了(它是4个字节并有符号)。

Long.parseLong("AA0F245C", 16);

4
太棒了,谢谢你!我大概应该知道这一点。但这让我感觉好多了,发帖前问的四个人都不知道:)。作为附带说明,我现在必须弄清楚为什么该人编写了我需要比较int的代码,以将它们作为int而不是long的形式……这可能意味着其他问题了。除此之外,...谢谢您的快速回答!!!!还要诅咒您的Java以获得可怕的错误消息...“这太重要了”会很有帮助。
罗洛克2012年

当我尝试使用大十六进制字符串时,会得到NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"...解决方案?
阿努姆·谢拉兹

@AnumSheraz您不想转换为long而是转换为字节数组。例如见stackoverflow.com/questions/140131/...
丹尼斯·塞居勒

转换为大量字节数组的另一种方法是使用BigInteger像这样的类:BigInteger value = new BigInteger(valueString, 16)
Javaru

32

你可以这样使用

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

1
我喜欢这个答案,不知道Integer类中对此有一个通用的,类型不敏感的方法。感谢您的知识。
Gewure '16

18

Java Integer可以处理的最大值为2147483657,即2 ^ 31-1。十六进制数AA0F245C作为十进制数是2853119068,并且太大了,因此您需要使用

Long.parseLong("AA0F245C", 16);

使它工作。


off:有趣的是,一个更详细的答案虽然在5分钟后得到了14分,但只有1分。
n611x007 2013年


5

这是正确的答案:

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


3

对于需要将带符号的字节的十六进制表示形式从两个字符的String转换为字节(在Java中始终为带符号的字节)的用户,有一个示例。解析十六进制字符串永远不会给出负数,这是有缺陷的,因为从某些角度来看(二进制补码)0xFF为-1。原理是将传入的String解析为大于字节的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。对于解析8个十六进制字符的有符号整数,您需要使用Long.parseLong,因为FFFF-FFFF(整数-1)在以正数表示时不适合Integer(给出4294967295)。因此,您需要Long来存储它。转换为负数并将其转换回整数后,它将适合。没有8个字符的十六进制字符串,最后不适合整数。


1

建议的其他选择是使用BigInteger该类。由于十六进制值通常是较大的数字,例如sha256或sha512值,因此它们很容易溢出an int和a long。正如其他答案所示,虽然转换为字节数组是一个选项BigInterger,但java中经常被遗忘的类也是一个选项。

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

0
//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);

0

试试这个:

长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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.