java如何接收十六进制_JAVA十六进制数据接收与传输

本文记录了使用Java实现十六进制字符串与ASCII字符串之间的转换,以及通过UDP进行数据的接收和发送。包括十六进制转换工具类,实现了字符串到十六进制、十六进制到字符串以及字节数组的转换。同时展示了如何通过UDP Socket接收和发送十六进制数据,以实现数据传输。
摘要由CSDN通过智能技术生成

由于项目中经常遇到与设备进行交互获取数据,不仅有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 < chars.length; i++){

hex.append(Integer.toHexString((int)chars[i]));

}

return hex.toString();

}

public static String convertHexToString(String hex){

StringBuilder sb = new StringBuilder();

StringBuilder sb2 = new StringBuilder();

for( int i=0; i

String s = hex.substring(i, (i + 2));

int decimal = Integer.parseInt(s, 16);

sb.append((char)decimal);

sb2.append(decimal);

}

return sb.toString();

}

public static byte[] hexStringToBytes(String hexString) {

if (hexString == null || hexString.equals("")) {

return null;

}

// toUpperCase将字符串中的所有字符转换为大写

hexString = hexString.toUpperCase();

int length = hexString.length() / 2;

// toCharArray将此字符串转换为一个新的字符数组。

char[] hexChars = hexString.toCharArray();

byte[] d = new byte[length];

for (int i = 0; i < length; i++) {

int pos = i * 2;

d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));

}

return d;

}

//返回匹配字符

private static byte charToByte(char c) {

return (byte) "0123456789ABCDEF".indexOf(c);

}

//将字节数组转换为short类型,即统计字符串长度

public static short bytes2Short2(byte[] b) {

short i = (short) (((b[1] & 0xff) << 8) | b[0] & 0xff);

return i;

}

//将字节数组转换为16进制字符串

public static String BinaryToHexString(byte[] bytes) {

String hexStr = "0123456789ABCDEF";

String result = "";

String hex = "";

for (byte b : bytes) {

hex = String.valueOf(hexStr.charAt((b & 0xF0) >> 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,如:*00007VERSION\n1$

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();

}

}

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值