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

Java十六进制转换器忽略第一个数字,java,unicode,hex,Java,Unicode,Hex,我有一个十进制字符unicode值(大写a是65) 当值变大时,例如120016是一个数学a,我必须根据它的十进制值检索字符 为了实现这一点,我使用了 char c = (char)key; 我遇到了一个非常奇怪的行为:第一个十六进制数字被忽略 下面是来自NetBeans的屏幕截图 这是我要打印的字符的unicode值 120016十六进制转换为1D4D0。 但是,当它被上面的代码转换时,它被转换为\uD4D0,正如您所看到的,第一个十六进制数字被忽略 我完全不知道为什么会这样。 这两条语

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

当值变大时,例如120016是一个数学a,我必须根据它的十进制值检索字符

为了实现这一点,我使用了

char c = (char)key;
我遇到了一个非常奇怪的行为:第一个十六进制数字被忽略

下面是来自NetBeans的屏幕截图

这是我要打印的字符的unicode值

120016十六进制转换为1D4D0。 但是,当它被上面的代码转换时,它被转换为\uD4D0,正如您所看到的,第一个十六进制数字被忽略

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

正如Thorbjørn Ravn Andersen所解释的,将int强制转换为char会自动丢弃int所消耗的字节(4字节),该字节超过了char类型的限制(2字节)。

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

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

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

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

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

Java中的字符相当于一个2字节的int。因此,您永远不会有一个十六进制值120016的字符,因为它超出了范围。int是32位,可以容纳8个十六进制数字。字符为16位,只能容纳4个十六进制数字。将int类型转换为char将自动放弃其余内容。感谢您的快速回答。那我应该用什么?字符串不会将unicode值转换为unicode字符,因为您无法执行
String s=“\u”+code
。那么我该怎么办?“我有一个十进制字符Unicode值”和“第一个十六进制数字”是相互矛盾的。事实上,您有一个二进制值,而不是十进制或十六进制数字。不清楚你在问什么。不要在这里张贴文字图片。完全浪费了你的时间和我们的带宽。谢谢你,你真是太好了!