首页 > 解决方案 > 通过套接字 java 发送扩展的 ascii

问题描述

目前我正忙于制作一个向客户端发送十六进制流的小程序。

现在我要做的是拆分流并将每 2 位数字转换为一个字符。我将其输出转换回字符串,以便我可以发送数据。为了调试,我正在使用wireshark 来查看发送的数据是否正确。

但这是不正确的。我知道为什么。因为例如我使用 b7 (dec 183) 而 char 只支持到 127。但现在的问题是,我不知道如何解决这个问题..

你能帮忙修复我的代码吗?谢谢 !

ServerSocket welcomeSocket2 = new ServerSocket(9999);
   Socket socket2 = welcomeSocket2.accept();  
   OutputStream os3 = socket2.getOutputStream();
   OutputStreamWriter osw3 = new OutputStreamWriter(os3);
   BufferedWriter bw3 = new BufferedWriter(osw3);



String hex4 = "00383700177a01020a6cb7000000000000018fffffff7f030201000a080000000000000000184802000007080444544235508001000002080104";

   StringBuilder output4 = new StringBuilder();
   for (int i =0; i< hex4.length(); i +=2){
       String str4 = hex4.substring(i, i+2);
       int outputdecimal = Integer.parseInt(str4,16);
       char hexchar = (char)outputdecimal;
       System.out.println(str4);
       output4.append(hexchar);
   }

 bw3.write(output4.toString());

这就是我在wireshark中得到的:

0000   00 38 37 00 17 7a 01 02 0a 6c c2 b7 00 00 00 00
0010   00 00 01 c2 8f c3 bf c3 bf c3 bf 7f 03 02 01 00
0020   0a 08 00 00 00 00 00 00 00 00 18 48 02 00 00 07
0030   08 04 44 54 42 35 50 c2 80 01

但是我必须在wireshark中获得的正确数据是这样的:

0000   00 38 37 00 17 7a 01 02 0a 6c b7 00 00 00 00 00
0010   00 01 8f ff ff ff 7f 03 02 01 00 0a 08 00 00 00
0020   00 00 00 00 00 18 48 02 00 00 07 08 04 44 54 42
0030   35 50 80 01 00 00 02 08 01 04

标签: javasocketsascii

解决方案


或者,如果您想将字节写入套接字,您可以直接执行此操作,而不是使用关于字符编码和文本转换的额外协议。

Java 中没有无符号字节。尽管如此,byte[]它通常用于传输原始数据。

样本数据:

byte[] data = { 0x00, 0x01, 0x7f, (byte)0x80, (byte)0xfe, (byte)0xff };

(Java 中没有byte文字。文字值从intto强制转换byte,在需要的地方使用强制转换语法覆盖编译器的范围检查。)

FilterOutputStream有一种将字节数组写入输出流的便捷方法。

ServerSocket welcomeSocket2 = new ServerSocket(9999);
Socket socket2 = welcomeSocket2.accept();  
OutputStream os3 = socket2.getOutputStream();

FilterOutputStream out = new FilterOutputStream(os3);
out.write(data);

推荐阅读