почему String.format ("% 02x", -1) возвращает ffffffff вместо ff? - PullRequest
0 голосов
/ 13 февраля 2020

Мне нужно преобразовать байт в шестнадцатеричную строку, и попробовал ниже: String.format ("% 02x", -1);

Обратите внимание, -1 здесь два целых числа дополнения

Однако возвращение, которое я получаю, это "ffffffff" вместо "ff", что ожидается?

Ответы [ 3 ]

0 голосов
/ 13 февраля 2020

Потому что ff не -1. Это 255. Указание 02 в вашем формате может pad короткое число с начальным нулем, чтобы получить его до 2 цифр, но оно не будет усекать число таким образом, чтобы получить неправильное значение .

Если вы хотите получить однобайтовое значение для числа, вы можете сократить его до одного байта с помощью &0xff.

int n = -1;
String.format("%02x", n&0xff);
0 голосов
/ 13 февраля 2020

Потому что %02 означает, что минимальная ширина результата должна быть 2 и дополнить 0, если необходимо. Он ничего не делает, если результат имеет ширину более 2 символов.

Зная это и факт, что целые числа Java имеют длину 32 бита, результат ожидается. Если вы хотите ff, вы можете сделать String.format("%02x", 255) или String.format("%02x", (byte)-1).

0 голосов
/ 13 февраля 2020

Форматирование не усекает никаких значащих цифр. Вот почему, если вы укажете меньше позиций, чем необходимо для представления, ваш лимит будет проигнорирован, и будут представлены все значащие цифры. Например, если у вас есть число 0x12345 и вы пытаетесь отформатировать его, используя только 2 позиции (как в вашем формате), результирующая строка будет состоять из 5 цифр, а не 2.

Шестнадцатеричный ff означает десятичное число 255, а не десятичный -1, как вы могли ожидать. Число -1 имеет тип int . Это занимает 4 байта в памяти. Его шестнадцатеричное представление действительно требует ffffffff, то есть 8 шестнадцатеричных цифр. Там нет ведущих нулей, которые вы могли бы обрезать. Ведущие нули возможны только для положительных чисел. Например, -2 будет отформатирован как fffffffe, от -3 до fffffffd, от -256 до ffffff00, от -257 до fffffeff и т. Д. c.

...