122

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

提前谢谢你的帮助。

4

9 回答 9

163

它对于 int 来说太大了(它是 4 个字节并且有符号)。

采用

Long.parseLong("AA0F245C", 16);
于 2012-06-25T17:50:20.097 回答
43

你可以这样使用

System.out.println(Integer.decode("0x4d2"))    // output 1234
//and vice versa 
System.out.println(Integer.toHexString(1234); //  output is 4d2);
于 2015-11-04T09:39:37.073 回答
21

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

Long.parseLong("AA0F245C", 16);

让它工作。

于 2012-06-25T17:55:31.667 回答
12

您可以使用带有格式参数的 parseInt 轻松完成。

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

javadoc 整数

于 2012-06-25T18:19:19.637 回答
7

这是正确的答案:

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

于 2017-04-03T11:46:04.030 回答
3

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

于 2018-05-25T09:25:02.097 回答
3

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

String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266
于 2019-04-19T14:35:35.470 回答
1
//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);
于 2019-03-01T10:30:21.360 回答
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;
}
于 2020-02-27T13:44:12.033 回答