Java: преобразование чисел и строки в шестнадцатеричный возвращает разные результаты. Почему?

#java #hex #ascii #primitive #primitive-types

#java #шестнадцатеричный #ascii #примитив #примитивные типы

Вопрос:

Попытка преобразовать числа в шестнадцатеричный формат завела меня в тупик, взгляните:

Число: 32

Ожидаемый шестнадцатеричный код (ASCII): 20

Результат из числа, полученного в виде строки:

 System.out.println(String.format("x", new BigInteger(1, "32".getBytes(StandardCharsets.US_ASCII))));
  

В результате я получаю 33 32 (как я понял, это происходит потому, что он анализирует 3 (= 33) и 2 (= 32))

Преобразование результата в число:

 System.out.println(Integer.toHexString(32));
  

Дает мне 20 (правильно)

Я хотел бы лучше понять эту ситуацию, может кто-нибудь объяснить, чем они отличаются друг от друга? (пожалуйста, не говорите «потому что это вызывает разные методы… будьте дружелюбны)

Кроме того, первый подход позволяет мне установить кодировку, а второй — нет. Почему?

Комментарии:

1. Похоже, вы понимаете разницу: «32» дает вам ASCII для ‘3’, затем ASCII для ‘2’. 32 само по себе дает другое значение. Похоже, вы это уже поняли.

2. Да, но если в ASCII нет числа 32 в таблице, как toHexString () узнает, как его преобразовать? А как насчет кодировки? Я чувствую, что не все понял…

3. Integer.toHexString(32) не имеет никакого отношения к ASCII. Он просто преобразует число 32 в шестнадцатеричный. "32".getBytes(US_ASCII) использует таблицу ASCII для преобразования 3 в байт, затем 2 в байт.

4. Итак, вы говорите, что ASCII допустим только для преобразования строк? ASCII не применяется к числам? Я все еще не понимаю, LOL

5. ДА. В этом-то и суть. ASCII — это способ преобразования строк в числа.

Ответ №1:

возврат getBytes() метода из строки разделяет каждый байт этой строки, который в вашем случае был бы ‘3’ и ‘2’.

при их печати с помощью String.format("x", ..... отображается шестнадцатеричное число их ASCII-кодов.

с другой стороны, Integer.toHexString(32) получает данные из toHexString метода, и этот метод не разделяет каждый отдельный байт и получает данные в шестнадцатеричном формате.

Комментарии:

1. Но я все еще запутался в кодировке, как Integer.toHexString (32) узнает, какую кодировку следует использовать? Что, если мне нужна другая кодировка?