JAVA十六进制数据转换

本文介绍了JAVA中进行十六进制数据转换的方法,包括十六进制字符串与ASCII及Byte数组之间的相互转换,并详细讲解了如何在接收和发送数据过程中应用这些转换技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、十六进制转换工具类

主要包含十六进制字符串转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<hex.length()-1; i+=2 ){
 
        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();
 
}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值