Java十六进制转换器忽略第一个数字

时间:2017-05-21 09:34:38

标签: java unicode hex

我有一个十进制的字符unicode值(大写A是65)。

当值越高时,例如120016是数学A,我必须根据它的十进制值检索字符。

为实现这一目标,我使用了

char c = (char)key;

我遇到一种非常奇怪的行为:忽略第一个十六进制数字。

以下是NetBeans的屏幕截图。

以下是我要打印的字符的unicode值

enter image description here

以十六进制转换的<1200> 120016是1D4D0。 但是,当它被上面的代码转换时,它将转换为\ uD4D0,如您所见,忽略第一个十六进制数字。

enter image description here

我完全不知道为什么会这样。 这两个语句之间没有指令,键值仅作为参数给出,因此在以十六进制转换时不能更改。

3 个答案:

答案 0 :(得分:1)

正如ThorbjørnRavnAndersen所解释的那样,将一个int转换为一个字符会静默地丢弃一个超过char类型限制的int(4个字节)消耗的字节(2个字节)。

要绕过此限制,请不要转换为char而是转换为String 您可以使用Integer.toHexString(int)方法 返回整数参数的字符串表示形式,作为基数为16的无符号整数。

int x =  120016;
String string = Integer.toHexString(x);

答案 1 :(得分:1)

数学A是120016 在utf-8中 Java使用 utf-16 ,所以这就是为什么你会看到不同的值 - 它是不同的编码

答案 2 :(得分:0)

a int花费32位,char花费16位,十六位数花费4位。 将int强制转换为char时,溢出的位将被截断。例如:

int key = 0b00000000000000011101010011010000;//120016
                            ^---------------
char c  =                 0b1101010011010000;// (c = (char)key) == 0xD4D0