Java очень требовательна к подписи, она не будет принимать значения для переполнения.Таким образом, если вы анализируете байт и он больше 127 (например, 130 dec или 83 hex), вы получите исключение NumberFormatException.То же самое происходит, если вы анализируете 8-значное шестнадцатеричное число как целое число (или 16-значное шестнадцатеричное число как длинное), и оно начинается с 8-F.Такие значения не будут интерпретироваться как отрицательные (дополнение двух), а как незаконные.
Если вы считаете, что это анальное удержание, я полностью согласен.Но это стиль Java.
Чтобы проанализировать шестнадцатеричные значения как числа дополнения до двух, либо используйте достаточно большой целочисленный тип (например, если вы анализируете байт, используйте Integer, а затем приводите тип к байту позже) или -- если вам нужно разобрать Long, разделите число пополам, это 16 цифр, затем объедините.Вот пример:
public static long longFromHex(String s) throws IllegalArgumentException {
if (s.length() == 16)
return (Long.parseLong(s.substring(0,8),16)<<32)|(Long.parseLong(s.substring(8,16),16)&0xffffffffL);
return Long.parseLong(s, 16);
}
Или, чтобы прочитать байт, просто используйте Integer вместо:
public static byte byteFromHex(String s) throws IllegalArgumentException {
int i = Integer.parseInt(s, 16);
if (i < 0 || i > 255) throw new IllegalArgumentException("input string "+s+" does not fit into a Byte");
return (byte)i;
}