#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) узнает, какую кодировку следует использовать? Что, если мне нужна другая кодировка?