发送高级ascii槽式套接字java

时间:2018-08-24 09:49:07

标签: java sockets ascii

我正忙着编写一个将十六进制流发送到客户端的小程序。

现在我要做的是拆分流并将每2位数转换为一个char。我的输出转换回字符串,以便我可以发送数据。为了进行调试,我使用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

1 个答案:

答案 0 :(得分:1)

或者,如果您想将字节写入套接字,则可以直接执行此操作,而不需要与字符编码以及文本之间的转换达成额外协议。

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

样本数据:

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

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

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

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

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