将十六进制字符串转换为整数
Posted
技术标签:
【中文标题】将十六进制字符串转换为整数【英文标题】:Convert hex string to int 【发布时间】:2012-06-27 00:20:24 【问题描述】:我正在尝试将一个长度为 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 标准库中完成。
提前感谢您的帮助。
【问题讨论】:
当你应该改变的时候,你正在成倍增长。0xAA0F245C = 2853119068
但Integer.MAX_VALUE = 0x7fffffff = 2147483647
我知道这个问题已经存在两年了。但是,java 8 启用了另一种解决方案。他们添加了满足您目的的 Integer.parseUnsignedInt("value",radix)
方法。如果值大于Integer.MAX_VALUE
,则映射为负数。
【参考方案1】:
对于 int(4 字节且有符号)来说实在是太大了。
使用
Long.parseLong("AA0F245C", 16);
【讨论】:
太棒了,谢谢!我可能应该知道这一点。但这让我感觉好多了,我在发帖之前问过的 4 个人都不知道 :)。作为旁注,我现在必须弄清楚为什么这个人编写了我需要比较整数的代码,以将它们作为整数而不是长整数......这可能意味着其他事情已经关闭。除此之外……谢谢您的快速回答!!!!还诅咒你的 java 你可怕的错误信息......“它太大了”会很有帮助。 当我尝试使用大的十六进制字符串时,我得到NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"
...解决方案?
@AnumSheraz 您不想转换为 long 但转换为字节数组。参见例如***.com/questions/140131/…
将大数转换为字节数组的另一种方法是使用BigInteger
类,如下所示:BigInteger value = new BigInteger(valueString, 16)
【参考方案2】:
你可以这样使用
System.out.println(Integer.decode("0x4d2")) // output 1234
//and vice versa
System.out.println(Integer.toHexString(1234); // output is 4d2);
【讨论】:
我喜欢这个答案,不知道 Integer 类中有一个通用的、类型不敏感的方法。谢谢你的知识。 这里也一样,我希望我能再投票 5 次。【参考方案3】:Java Integer
可以处理的最大值是 2147483657,即 2^31-1。十六进制数AA0F245C是十进制数2853119068,太大了,需要使用
Long.parseLong("AA0F245C", 16);
让它工作。
【讨论】:
off:有趣的是,一个更详细的答案(尽管 5 分钟后)仅获得 1 个赞成票,而 14 个赞成票。虽然是真的,但这个答案并没有说神奇的“4 个字节”和“签名”......嗯.【参考方案4】:您可以使用带有格式参数的 parseInt 轻松完成。
Integer.parseInt("-FF", 16) ; // returns -255
javadoc Integer
【讨论】:
链接失效【参考方案5】:这是正确的答案:
myPassedColor = "#ffff8c85"
int colorInt = Color.parseColor(myPassedColor)
【讨论】:
【参考方案6】:对于那些需要将带符号字节的十六进制表示从两个字符的字符串转换为字节(在 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 个字符的十六进制字符串,最后不适合整数。
【讨论】:
【参考方案7】:建议的另一个选项是使用BigInteger
类。由于十六进制值通常是大数字,例如 sha256 或 sha512 值,它们很容易溢出 int
和 long
。虽然转换为字节数组是一个选项,正如其他答案所示,BigInterger
,java 中经常被遗忘的类,也是一个选项。
String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266
【讨论】:
【参考方案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);
【讨论】:
【参考方案9】:试试这个:
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;
【讨论】:
以上是关于将十六进制字符串转换为整数的主要内容,如果未能解决你的问题,请参考以下文章