我有一堆十六进制字符串,其中一个,例如:
d1bc4f7154ac9edb
是“-3333702275990511909”的十六进制值。如果你做Long.toHexString(“d1bc4f7154ac9edb”),那就是你得到的相同的十六进制;
现在,让我们假设我只能访问十六进制字符串值,就是这样。这样做:
Long.parseLong(hexstring, 16);
不起作用,因为它将其转换为对Long而言太大的其他值。是否可以将这些无符号十六进制值转换为有符号长整数?
谢谢!
答案 0 :(得分:21)
您可以使用BigInteger
对其进行解析并返回long
:
long value = new BigInteger("d1bc4f7154ac9edb", 16).longValue();
System.out.println(value); // this outputs -3333702275990511909
答案 1 :(得分:6)
您可以将其分成两半,一次读取32位。 然后使用shift-left 32和逻辑或将其恢复为单个long。
答案 2 :(得分:4)
以下方法的好处是,每次需要时都不会创建另一个BigInteger
对象。
public class Test {
/**
* Returns a {@code long} containing the least-significant 64 bits of the unsigned hexadecimal input.
*
* @param valueInUnsignedHex a {@link String} containing the value in unsigned hexadecimal notation
* @return a {@code long} containing the least-significant 64 bits of the value
* @throws NumberFormatException if the input {@link String} is empty or contains any nonhexadecimal characters
*/
public static final long fromUnsignedHex(final String valueInUnsignedHex) {
long value = 0;
final int hexLength = valueInUnsignedHex.length();
if (hexLength == 0) throw new NumberFormatException("For input string: \"\"");
for (int i = Math.max(0, hexLength - 16); i < hexLength; i++) {
final char ch = valueInUnsignedHex.charAt(i);
if (ch >= '0' && ch <= '9') value = (value << 4) | (ch - '0' );
else if (ch >= 'A' && ch <= 'F') value = (value << 4) | (ch - ('A' - 0xaL));
else if (ch >= 'a' && ch <= 'f') value = (value << 4) | (ch - ('a' - 0xaL));
else throw new NumberFormatException("For input string: \"" + valueInUnsignedHex + "\"");
}
return value;
}
public static void main(String[] args) {
System.out.println(fromUnsignedHex("d1bc4f7154ac9edb"));
}
}
这会产生
-3333702275990511909
答案 3 :(得分:4)
先前的答案过于复杂或过时。
Long.parseUnsignedLong(hexstring, 16)