java 创建TCP连接发送16进制数据并同时接受服务端响应16进制数据,并解析成可供人们可读的10进制数据返回
简介:
这是我做一个物联网项目,项目需要我对机器发送一些16进制的字符串指令,然后呢对端机器就会给我返回个一组16进制数据,此时我需要解析成可供人们可读的10进制数据返回给前端,机器的连接方式是TCP不是常规HTTP。
源代码:
建立TCP连接,建立输入以及输出流
public static void main(String[] args) throws Exception {// 实例化Socket对象,连接端口502服务器建立通信通道Socket socket = new Socket("192.168.87.141", 502);//要传给对端的数据String reqString = "00 00 00 00 00 02 01 03 00 11 00 01";//建立输出流,准备输出数据OutputStream outputStream = socket.getOutputStream();//因为我的数据是16进制需要给他转成对象的字节数组才能传送byte[] bytes = hexStringToByteArray(reqString);//建立输入流,准备接受数据InputStream inputStream = socket.getInputStream();//发送信息outputStream.write(bytes);//将对端返回的数据进行解析Integer count = streamTransStr(inputStream);}
16进制字符串转换为字节数组
/*** 16进制字符串转换为字节数组** @param hexString: 16进制化后的字符串* @return byte[]* @author A乐神* date 2023/12/15**/public static byte[] hexStringToByteArray(String hexString) throws InterruptedException {hexString = hexString.replaceAll(" ", "");int len = hexString.length();byte[] bytes = new byte[len / 2];for (int i = 0; i < len; i += 2) {// 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16));}//上述循环有个很大问题,是java本身问题,不睡眠等一下的话,可能代码16进制字符串转字节数组转换还没完成,就已经开始执行下一行了//这个时间可以自行缩短Thread.sleep(1000);return bytes;}
对端返回的tcp信息解析,我的是16进制返回值解析成10进制,读者可以根据自己业务进行更改。
public static Integer streamTransStr(InputStream inputStream) throws IOException {StringBuilder stringBuilder = new StringBuilder();byte[] buffer = new byte[1024];int length;while ((length = inputStream.read(buffer)) != -1) {for (int i = 0; i < length; i++) {//对端返回的是16进制数,但是字节需要先用10进制存,下面意思是读取1个字节并用10进制可读取的int表示int tenSys = buffer[i] & 0xFF;// toHexString作用是10进制转16进制数据//需要将16进制数还原处理来,将值转成16进制字符串,一字节等于两位的16进制数stringBuilder.append(Integer.toHexString(tenSys));}}//16进制转成10进制//我的解析值不具备0x,parseInt默认是把10进制字符串转成integer,如果不是10进制需要指明return Integer.parseInt(stringBuilder.toString(), 16);}
------------------------------------------与正文内容无关------------------------------------
如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!小弟在这拜谢了!
如果您觉得我的文章在某些地方写的不尽人意或者写的不对,从而让你对你人生观产生颠覆(概不负责),需要斧正,麻烦在评论区不吝赐教,作者看到后会根据您的提示查阅文章进行修改,还这世间一个公理一片蓝天