Помогите пожалуйста, нужно перевести из число из десятичной системы в шестнадцатиричную, и обратно
следущий код нормально работает на положительных чисел, но если мы конвертируем отрицательное десятичное в шестнадцатиричное, а затем обратно — вылетает эксэпшн
java.lang.NumberFormatException: For input string: "FFFFFFFFFFFFFFFF"
// перевод из строкового представления числа в десятичной системе счисления
// в строковое представление числа в шестнадцатиричной системе счисления
StringBuffer strBuffer = new StringBuffer();
long a = Long.valueOf("-1");
strBuffer.append(Long.toHexString(a).toUpperCase());
// обратный перевод - в следущей строке вылетает Exception
long a = Long.decode("0x" + strBuffer.toString());
strBuffer.delete(0, strBuffer.length());
strBuffer.append(Long.toString(a));
DD>java.lang.NumberFormatException: For input string: "FFFFFFFFFFFFFFFF"
DD>DD>// обратный перевод - в следущей строке вылетает Exception
DD>long a = Long.decode("0x" + strBuffer.toString());
DD>strBuffer.delete(0, strBuffer.length());
DD>strBuffer.append(Long.toString(a));
DD>
Читаем документацию:
The sequence of characters following an (optional) negative sign and/or radix specifier ("0x", "0X", "#", or leading zero) is parsed as by the Long.parseLong method with the indicated radix (10, 16, or 8). This sequence of characters must represent a positive value or a NumberFormatException will be thrown. The result is negated if first character of the specified String is the minus sign. No whitespace characters are permitted in the String.
Для отрицательных чисел надо использовать знак — в начале: decode("-0x64") даст в результате -100.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, mrDD, Вы писали:
DD>Помогите пожалуйста, нужно перевести из число из десятичной системы в шестнадцатиричную, и обратно
DD>следущий код нормально работает на положительных чисел, но если мы конвертируем отрицательное десятичное в шестнадцатиричное, а затем обратно — вылетает эксэпшн
DD>java.lang.NumberFormatException: For input string: "FFFFFFFFFFFFFFFF"
DD>DD>// перевод из строкового представления числа в десятичной системе счисления
DD>// в строковое представление числа в шестнадцатиричной системе счисления
DD>StringBuffer strBuffer = new StringBuffer();
DD>long a = Long.valueOf("-1");
DD>strBuffer.append(Long.toHexString(a).toUpperCase());
DD>// обратный перевод - в следущей строке вылетает Exception
DD>long a = Long.decode("0x" + strBuffer.toString());
DD>strBuffer.delete(0, strBuffer.length());
DD>strBuffer.append(Long.toString(a));
DD>
Long.toHexString преобразует значение в беззнаковое представление. Тогда как Long.decode работает со строками содержащими знак. Вот и получается что значение FFFFFFFFFFFFFFFF за границей знакового long.