Java - 将解析和无符号十六进制字符串转换为带符号的long

Pet*_*ter 17 java hex long-integer

我有一堆十六进制字符串,其中一个,例如:

  d1bc4f7154ac9edb
Run Code Online (Sandbox Code Playgroud)

这是十六进制值"-3333702275990511909".如果你做Long.toHexString("d1bc4f7154ac9edb"),这是你得到的相同的十六进制;

现在,让我们假设我只能访问十六进制字符串值,就是这样.这样做:

  Long.parseLong(hexstring, 16);
Run Code Online (Sandbox Code Playgroud)

不起作用,因为它将它转换为对Long来说太大的不同值.是否可以将这些无符号十六进制值转换为有符号长整数?

谢谢!

Whi*_*g34 22

您可以使用BigInteger它来解析它并返回long:

long value = new BigInteger("d1bc4f7154ac9edb", 16).longValue();
System.out.println(value); // this outputs -3333702275990511909
Run Code Online (Sandbox Code Playgroud)

  • 对于现代访客来说只是一个注释:正如Scott Carey所言,从Java 8开始,我们可以简单地做`Long.parseUnsignedLong(hexstring,16)`,太酷了:) (3认同)

Sco*_*rey 8

先前的答案过于复杂或过时。

Long.parseUnsignedLong(hexstring, 16)


Knu*_*rud 6

您可以将其拆分为一半,一次读取32位.然后使用shift-left by 32和逻辑或将其恢复为单个long.

  • 大致类似的东西:(Long.parseLong(hexstring.substring(0,8),16)<< 32)| (Long.parseLong(hexstring.substring(8,16),16)<< 0) (2认同)