【问题标题】:Java hexadecimal converter ignores the first digitJava 十六进制转换器忽略第一个数字
【发布时间】:2017-10-21 01:47:08
【问题描述】:

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

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

为此,我使用了

char c = (char)key;

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

这是来自 NetBeans 的屏幕截图。

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

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

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

【问题讨论】:

  • char 在 Java 中相当于一个 2 字节的 int。所以你永远不可能有一个十六进制值为 120016 的字符,因为它超出了范围
  • 一个 int 是 32 位,可以容纳 8 个十六进制数字。一个 char 是 16 位的,只能保存 4 个十六进制数字。将 int 类型转换为 char 会默默地丢弃其余部分。
  • 感谢您的快速回答。那我应该用什么?字符串不会将 unicode 值转换为 unicode 字符,因为您不能执行String s = "\u" + code。那我该怎么办?
  • '我有一个十进制字符 Unicode 值'和'第一个十六进制数字'是相互矛盾的。现实情况是你有一个二进制值,而不是十进制或十六进制数字。不清楚你在问什么。请勿在此处发布文字图片。完全浪费您的时间和我们的带宽。
  • 谢谢你,你太客气了!

标签: java unicode hex


【解决方案1】:

正如 Thorbjørn Ravn Andersen 解释的那样,将 int 强制转换为 char 会默默地丢弃超出 char 类型(2 个字节)限制的 int(4 个字节)消耗的字节。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-08
        • 1970-01-01
        • 2017-09-07
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 2017-10-06
        相关资源
        最近更新 更多