You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:42:21