ITPub博客

首页 > IT职业 > IT职场 > JAVA十六进制数据接收与传输

JAVA十六进制数据接收与传输

IT职场 作者:zzfh 时间:2021-09-09 09:11:48 0 删除 编辑

由于项目中经常遇到与设备进行交互获取数据,不仅有Python版本、还有Java版本,还可能会有C#版本,在此做个记录。

一、十六进制转换工具类

主要包含十六进制字符串转ASCII,ASCII转十六进制字符串以及十六进制字符串转Byte数组等方法:

/**
 * Created by wly on 2018/4/17.
 */
public class HexConvert {

public static String  convertStringToHex(String str){

    char[] chars = str.toCharArray();

    StringBuffer hex = new StringBuffer();
    for(int i = 0; i > 4));
        hex += String.valueOf(hexStr.charAt(b & 0x0F));
        result += hex + " ";
    }
    return result;
}

public static void main(String[] args) {


    System.out.println("======ASCII码转换为16进制======");
    String str = "*00007VERSION\n1$";
    System.out.println("字符串: " + str);
    String hex = HexConvert.convertStringToHex(str);
    System.out.println("====转换为16进制=====" + hex);

    System.out.println("======16进制转换为ASCII======");
    System.out.println("Hex : " + hex);
    System.out.println("ASCII : " + HexConvert.convertHexToString(hex));

    byte[] bytes = HexConvert.hexStringToBytes( hex );

    System.out.println(HexConvert.BinaryToHexString( bytes ));
}
}

二、接收数据

public class UdpReceiverThread {

public static void main(String[] args) throws Exception {
// 定义一个接收端,并且指定了接收的端口号
DatagramSocket socket = new DatagramSocket(6070);

while (true) {
    byte[] buf = new byte[1024*5];
    // 解析数据包
    DatagramPacket packet = new DatagramPacket(buf, buf.length);

    socket.receive(packet);

    String ip = packet.getAddress().getHostAddress();

    buf = packet.getData();

    //将字节数组转换为16进制字符串
    String hexString = HexConvert.BinaryToHexString( buf );//含有空格,如:2A 30 30 30 30 37 56 45 52 53 49 4F 4E 5C 6E 31 24 

    hexString =  hexString.replace( " ","" );//去除空格

    String asc = HexConvert.convertHexToString( hexString );//转为ASCII,如:*00007VERSIONn1$

    System.out.println("收到 " + ip + " 发来的消息:" + asc);

}

}
}

三、发送数据

public class UDPSenderThread {

public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();

String serial = "*00007VERSION\n1$";//串口字符串

String hex = HexConvert.convertStringToHex(serial);//转化为十六进制字符串:2a303030303756455253494f4e5c6e3124

byte[] buf = HexConvert.hexStringToBytes( hex );//将十六进制字符串转为字节数组

//将数据打包
DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.11.139"), 6070);

socket.send(packet);

socket.close();

}
}

在此基础上进行封装、抽象后即可处理十六进制数据的传输与接收问题。

原文出处

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4313/viewspace-2800341/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-12

  • 博文量
    0
  • 访问量
    655