【问题标题】:UTF-16 conversion given wrong hex valueUTF-16 转换给出了错误的十六进制值
【发布时间】:2018-09-15 19:56:06
【问题描述】:

代码sn-p是:

String str = "h";
StringBuffer buf = new StringBuffer();
byte[] bytes = str.getBytes("UTF-16BE");
for (int i = 0; i < bytes.length; i++) {
    String byteAsHex = Integer.toHexString(bytes[i]);
    buf.append(byteAsHex);
}
System.out.println(buf.toString());

输出为:068,其中拉丁小写字母 H 为 0068。

您能告诉我为什么缺少前导 0 吗?

【问题讨论】:

  • docs.oracle.com/javase/8/docs/api/java/lang/…:“这个值被转换成十六进制(以 16 为基数)的 ASCII 数字字符串没有额外的前导 0。”(强调我的)。 如果无符号幅度为零,则由单个零字符'0'表示

标签: java unicode utf-16 utf


【解决方案1】:

发生这种情况是因为Integer.toHexString() 将始终返回数字的最短表示形式,即不带任何前导零。因此,在您的情况下,您有一个 2 个字节的数组:[0, 0x68]Integer.toHexString() 被调用两次,第一次返回 0,第二次返回 68

为了解决这个问题,如果字符串长度为 1,您需要在 Integer.toHexString() 返回的每个字符串前面加上 '0'

【讨论】:

    【解决方案2】:

    这是因为Integer.toHexString(0) 的结果是"0",而不是"00"

    您可以在更换时解决此问题

    Integer.toHexString(bytes[i])
    

    通过

    String.format("%02x", bytes[i])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 2022-01-16
      • 2011-02-19
      • 2018-12-06
      • 1970-01-01
      • 2015-04-28
      相关资源
      最近更新 更多