Integer.toBinaryString() 没有正确转换为二进制

Adi*_*tya 1 java binary

我目前正在研究 Vernam 密码程序,其中很大一部分是将明文转换为二进制的能力。我研究了如何做到这一点,我发现Integer.toBinaryString()在将明文的每个单独字符转换为二进制时效果最好。对于大多数字符,此转换有效,但是,我发现了导致我在转换中遇到错误的实例。

例如,每当我运行此代码时:System.out.println(Integer.toBinaryString('€'));我希望输出为10000000,但是,我却得到了10000010101100输出。根据这个 ASCII 表,我知道扩展的 ASCII 字符可以有一些值的变化,但是,这个表中的大多数字符在扩展的 ASCII 字符部分是准确的,欧元在 ASCII 中由 128 表示。

为什么要Integer.toBinaryString('€')回来10000010101100?有没有办法解决这个问题?

Tag*_*eev 5

根据Java 语言规范第3.10.4 节:

字符文字只能表示 UTF-16 代码单元(第 3.1 节)

当您调用 时Integer.toBinaryString(),char 文字被隐式转换(加宽)为 an int,因此它被替换为相应的代码单元值,即 8364 表示“€”。8364 的二进制表示确实是 10000010101100,因此该方法的行为是正确的。

要使用 CP1252 代码页(列在您所指的网站上)对“€”进行编码,您可以使用特定的 Charset 对象:

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