Ответ 1
Вы можете использовать BigInteger
, чтобы проанализировать его и вернуть long
:
long value = new BigInteger("d1bc4f7154ac9edb", 16).longValue();
System.out.println(value); // this outputs -3333702275990511909
У меня есть группа шестнадцатеричных строк, одна из которых, например, есть:
d1bc4f7154ac9edb
который является шестнадцатеричным значением "-3333702275990511909". Это тот же самый гексагон, который вы получаете, если вы делаете Long.toHexString( "d1bc4f7154ac9edb" );
Теперь давайте предположим, что у меня есть только доступ к значениям шестнадцатеричной строки, и это все. Выполнение этого действия:
Long.parseLong(hexstring, 16);
Не работает, потому что он преобразует его в другое значение, которое слишком велико для Long. Есть ли возможность конвертировать эти беззнаковые шестнадцатеричные значения в подписанные longs?
Спасибо!
Вы можете использовать BigInteger
, чтобы проанализировать его и вернуть long
:
long value = new BigInteger("d1bc4f7154ac9edb", 16).longValue();
System.out.println(value); // this outputs -3333702275990511909
Вы можете разбить его пополам и читать 32 бита за раз. Затем используйте shift-left на 32 и логический или чтобы вернуть его в один длинный.
Приведенный ниже метод имеет преимущество не создавать другой объект 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
Предыдущие ответы слишком сложны или устарели.
Long.parseUnsignedLong(hexstring, 16)