UTF-16 转换给出了错误的十六进制值
UTF-16 conversion given wrong hex value
代码片段是:
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 吗?
发生这种情况是因为 Integer.toHexString()
将始终 return 数字的最短表示形式,即没有任何前导零。因此,在您的情况下,您有一个 2 字节的数组:[0, 0x68]
和 Integer.toHexString()
被调用两次,第一次是 returns 0
,第二次是returns 68
.
为了解决这个问题,如果字符串长度为 1,您需要将 '0'
添加到由 Integer.toHexString()
编辑的每个字符串 return 之前。
这是因为 Integer.toHexString(0)
结果是 "0"
,而不是 "00"
。
您可以在替换
时解决此问题
Integer.toHexString(bytes[i])
来自
String.format("%02x", bytes[i])
代码片段是:
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 吗?
发生这种情况是因为 Integer.toHexString()
将始终 return 数字的最短表示形式,即没有任何前导零。因此,在您的情况下,您有一个 2 字节的数组:[0, 0x68]
和 Integer.toHexString()
被调用两次,第一次是 returns 0
,第二次是returns 68
.
为了解决这个问题,如果字符串长度为 1,您需要将 '0'
添加到由 Integer.toHexString()
编辑的每个字符串 return 之前。
这是因为 Integer.toHexString(0)
结果是 "0"
,而不是 "00"
。
您可以在替换
时解决此问题Integer.toHexString(bytes[i])
来自
String.format("%02x", bytes[i])