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

如何将含\x转义的字符串转二进制后通过Java Socket发送?

问题核心原因

你遇到的异常本质是字符串和二进制字节流的编码歧义:Java中String是UTF-16编码的字符序列,直接转字节默认会使用系统编码篡改原始二进制值,不能用String直接存储混合二进制的内容。

正确实现步骤

1. 存储原始二进制数据

优先直接用字节数组存储二进制序列,避免字符编码转换带来的异常:

// 对应你原来的\x00\x00\x00@\x02\t\x01\x00... 二进制序列,后续字节依次补充即可
byte[] binData = new byte[]{0x00, 0x00, 0x00, 0x40, 0x02, 0x09, 0x01, 0x00};

如果确实需要从已有String转换,必须指定单字节兼容编码ISO-8859-1,避免多字节编码篡改二进制值:

// 仅当你必须从String转换时使用,优先直接用字节数组定义
String javaStr = "\u0000\u0000\u0000@\u0002\t\u0001\u0000******";
byte[] binData = javaStr.getBytes(StandardCharsets.ISO_8859_1);

2. 通过Socket发送原始字节流

直接把字节数组写入Socket的输出流即可,不要加任何字符编码转换:

import java.net.Socket;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

public class BinSocketClient {
    public static void main(String[] args) throws Exception {
        // 建立Socket连接
        Socket socket = new Socket("127.0.0.1", 11111);
        OutputStream out = socket.getOutputStream();
        
        // 构造二进制数据(二选一即可)
        // 方案1:直接定义字节数组(推荐)
        byte[] binData = new byte[]{0x00, 0x00, 0x00, 0x40, 0x02, 0x09, 0x01, 0x00};
        // 方案2:从已有String转换
        // String javaStr = "\u0000\u0000\u0000@\u0002\t\u0001\u0000******";
        // byte[] binData = javaStr.getBytes(StandardCharsets.ISO_8859_1);
        
        // 发送原始二进制数据
        out.write(binData);
        out.flush();
        
        // 关闭资源
        out.close();
        socket.close();
    }
}

注意事项

  • 不要用PrintWriter、BufferedWriter这类字符流工具发送二进制数据,它们会自动做字符编码转换,破坏原始二进制值
  • 不要用UTF-8、GBK等多字节编码转换包含控制字符的字符串,会出现字节变长、转义错误的问题

内容的提问来源于stack exchange,提问作者admin adminov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:18:03