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

十六进制转字节数组TCP传输后值异常,求问题排查方案

问题分析与解决方法

错误原因

你的服务器端代码存在核心逻辑错误:将二进制字节数据(原始十六进制转换后的字节)先转成String,再通过String.getBytes()转回字节,这个过程会直接破坏原始数据。

具体来说:

  • 客户端发送的字节数组包含0xE1和0xA4两个字节,它们不属于合法的系统默认字符集(或你后续指定的UTF-8)编码文本。当执行new String(reply, 0, bytesRead)转换时,JVM会把无法解析的字节替换为Unicode替换字符�(对应UTF-8字节0xEF 0xBF 0xBD)。
  • 后续调用str.getBytes(StandardCharsets.UTF_8)时,得到的是被替换后的字节,最终转成十六进制就变成了EFBFBD,和原始的E1A4完全不符。

正确实现

直接对接收的字节数组进行十六进制转换,跳过String转换步骤,修改服务器端代码如下:

public void deserialize(InputStream inputStream) throws IOException {
    byte[] reply = new byte[1024];
    int bytesRead;

    while (-1 != (bytesRead = inputStream.read(reply))) {
        String message = convertBytesToHex(reply, 0, bytesRead);
        LOGGER.info("MESSAGE ::" + message);
    }
}

public static String convertBytesToHex(byte[] bytes, int offset, int length) {
    StringBuilder sb = new StringBuilder();
    for (int i = offset; i < offset + length; i++) {
        sb.append(String.format("%02X", bytes[i]));
    }
    return sb.toString();
}

关键说明

  • 二进制数据(比如TCP传输的自定义协议字节)必须始终以字节数组形式处理,不要随意转成String,除非你明确知道这些字节是符合某一字符集的文本内容。
  • 直接操作字节数组进行十六进制转换,能保证原始数据完全不丢失,和客户端发送的内容完全一致。

内容的提问来源于stack exchange,提问作者Mohamed Nazir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:35:17