Hex.encodeHexString转换字节数组异常求助:结果不符预期
问题分析与解决方案
看起来你在这里混淆了两个完全不同的转换逻辑——Hex.encodeHexString的作用是把每个字节直接转换成对应的两位十六进制字符并拼接,而你第一个场景的预期结果"1443",其实是把字节数组当成16位无符号整数的十进制值,这和API的功能完全不匹配。
为什么会出现这种差异?
我们拆解两个场景的细节:
- 场景2(符合预期):字节数组
[5, 120],120的十六进制是0x78,所以Hex.encodeHexString直接拼接成0578,刚好和你预期的十六进制字符串一致,所以你觉得结果正确。 - 场景1(不符合预期):字节数组
[5, -93],Java的byte是有符号类型,-93对应的补码转换成无符号字节值是256 - 93 = 163(十六进制0xA3),所以Hex.encodeHexString会输出05a3——这其实是这个API的正确行为,不是错误。而你预期的"1443",是把这两个字节当成大端序的16位无符号整数计算出来的十进制值:5 * 256 + 163 = 1443。
解决方案:根据需求选择正确的转换方式
如果你的需求是得到字节数组表示的16位无符号整数的十进制字符串(比如场景1要得到"1443")
不要用Hex.encodeHexString,而是需要把字节数组解析成整数,再转成字符串。这里提供两种常用方法:
方法1:使用ByteBuffer(推荐,代码简洁)
byte[] value1 = new byte[]{5, -93}; // 以大端序(网络字节序,默认)解析为短整数,再转成无符号值 int tcpPort = ByteBuffer.wrap(value1).getShort() & 0xFFFF; String tcpPortStr = String.valueOf(tcpPort); // 结果为"1443"
方法2:手动计算(适合理解底层逻辑)
byte[] value1 = new byte[]{5, -93}; // 先把每个有符号byte转成无符号int值 int unsignedByte0 = value1[0] & 0xFF; int unsignedByte1 = value1[1] & 0xFF; // 按大端序计算整数值 int tcpPort = unsignedByte0 * 256 + unsignedByte1; String tcpPortStr = String.valueOf(tcpPort); // 结果为"1443"
如果你的需求确实是得到字节数组的十六进制字符串
那Hex.encodeHexString的输出是正确的,你的场景1预期"1443"其实是错误的——因为1443的十六进制是0x5A3,也就是字符串05a3,和API的输出一致。
内容的提问来源于stack exchange,提问作者Yellappa
相关产品推荐
相关产品推荐

