我做了一个socket通信的小程序,客服端发送的是一些十六进制的数据(1K的大小),为什么我这边接收过来是一些乱码呢
try {
     ServerSocket server=new ServerSocket(12345);
    
     System.out.println("正在监听12345端口......");
     //保持阻塞,等待连接
     Socket s=server.accept();
    
     System.out.println("连接OK");
    
     BufferedInputStream bis=new BufferedInputStream(s.getInputStream());            //向socket 写入数据
     PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
    
     //接收从控制台接收的信息
     InputStreamReader isr2=new InputStreamReader(System.in);
     BufferedReader br2=new BufferedReader(isr2);
    
   System.out.println("请输入命令:");
   String info=br2.readLine();
   pw.print(info);
   pw.flush();
   System.out.println("发出命令"+info);
    
     while(true)
     {
       //每次接收的数据
       byte[] data=new byte[1024];
       int len=bis.read(data);
       String data1=new String(Arrays.copyOf(data,len));
       System.out.println(data1);//就是这儿输出的data1是乱码
                         }
请问要怎么修改,才能输出的是十六进制的数

解决方案 »

  1.   

    编码格式只要统一就没问题。关于socket通讯,有一个小框架,挺方便的。MINA 框架。是基于tcp/udp的传输。 
      

  2.   

    楼主描述的有点模糊,十六进制数据指什么?
    数据对应的十六进制字符串,还是直接就是字节数组?
    前者的话,你当前的写法应该不会乱码
    后者的话,需要一个专门的方法把字节数组转为十六进制字符串,提供一个方法:    private static final String HEX_CODE = "0123456789ABCDEF";    public static String byteArrayToHexString(byte[] bs) {
            int _byteLen = bs.length;
            StringBuilder _result = new StringBuilder(_byteLen * 2);
            for (int i = 0; i < _byteLen; i++) {
                int n = bs[i] & 0xFF;
                _result.append(HEX_CODE.charAt(n >> 4));
                _result.append(HEX_CODE.charAt(n & 0x0F));
            }
            return String.valueOf(_result);
        }然后修改如下:while (true) {
        // 每次接收的数据
        byte[] data = new byte[1024];
        int len = bis.read(data);
        String data1 = byteArrayToHexString(Arrays.copyOf(data, len));
        System.out.println(data1);// 就是这儿输出的data1是乱码
    }