Integer.toBinaryString () неправильно преобразовывает в двоичный - PullRequest
1 голос
/ 06 февраля 2020

В настоящее время я работаю над программой шифрования Vernam, и большая часть этого заключается в возможности преобразования открытого текста в двоичный файл. Я изучил, как это сделать, и обнаружил, что Integer.toBinaryString() будет лучше всего работать при преобразовании каждого отдельного символа открытого текста в двоичный. Для большинства символов это преобразование работает, однако я обнаружил случаи, когда я сталкиваюсь с ошибкой в ​​преобразовании.

Например, всякий раз, когда я запускаю этот код: System.out.println(Integer.toBinaryString('€')); я ожидаю вывод 10000000, однако, вместо этого выводится 10000010101100. В соответствии с этой таблицей ASCII , я знаю, что расширенные символы ASCII могут иметь некоторые различия в значениях, однако большинство символов в этой таблице являются точными в расширенном разделе символов ASCII, евро представлен 128 в ASCII ,

Почему Integer.toBinaryString('€') возвращает 10000010101100? Есть ли способ, которым я могу это исправить?

1 Ответ

5 голосов
/ 06 февраля 2020

Согласно Java Спецификация языка , §3.10.4:

Символьные литералы могут представлять только единицы кода UTF-16 (§3.1)

Когда вы вызываете Integer.toBinaryString(), буквенный символ неявно преобразуется (расширяется) в int, поэтому он заменяется соответствующим значением единицы кода, которое равно 8364 для '€'. Бинарное представление для 8364 действительно 10000010101100, поэтому метод ведет себя правильно.

Для кодирования '€' с использованием кодовой страницы CP1252, которая указана на веб-сайте, на который вы ссылаетесь, вы можете использовать указатель c Объект Charset:

ByteBuffer buffer = Charset.forName("CP1252").encode("€");
System.out.println(Integer.toBinaryString(buffer.get() & 0xFF)); // prints 10000000
...