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

原创 2018年04月17日 17:36:20

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

}
}

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


更多博客内容详见我的博客 Wang's Blog

JAVA socket 进行十六进制报文交互测试

1、将字符串转换为字节流,作为输出流 2、将输入字节流转换为字符串,验证交互数据的正确性 3、建立socket连接,发送数据包,解析返回数据包 4、可应用于基于协议的压力测试 5、通用自动化测试工具效...
  • heart_1014
  • heart_1014
  • 2016-12-13 11:37:55
  • 9417

java socket发送十六进制字节内容发生变化的问题解决

各种IO的错误使用. 今天遇到的这个问题搁置了一两个小时.还真是不该. 我发送的如下的内容: 0d 0d 07 80 00 01 01 02 03 04 05 06 07 08 0d 里面的80总是显...
  • thanklife
  • thanklife
  • 2013-11-29 17:34:08
  • 7478

Android TCP/IP 发送接收16进制数据

// 设置服务器IP和端口 private static final String SERVERIP_2        ="192.168.5.178";  private static final ...
  • small5e4444
  • small5e4444
  • 2013-01-30 21:31:33
  • 11771

UDP十六进制数据传输

  • 2011年11月21日 13:49
  • 224KB
  • 下载

vb mscomm1串口通信接收发送十六进制数据

Private Sub Command1_Click()Dim OutBuffer() As ByteDim tem As VariantDim e As IntegerDim q As Intege...
  • qq112358hai198771
  • qq112358hai198771
  • 2011-02-28 14:49:00
  • 3576

MINA源码学习---mina怎么把字符转换为16进制的

源代码如下,介个就不解释啦 package org.apache.mina.core.buffer; /** * Provides utility methods to dump an {@l...
  • cao478208248
  • cao478208248
  • 2014-12-03 17:14:21
  • 1398

socket客户端与服务端代码(解决16进制输入流转换字符串操作)

Android socket 客户端 与 服务端代码实现 完整代码
  • guang_liang_
  • guang_liang_
  • 2016-09-22 12:16:11
  • 3281

Java串口通信(16进制)

/** 字节流读取底层发来的16进制数据时,当Java是按照ASCII码的方式转换,当字符超过“80”时会出现乱码,所以要将字节流数据转换为十六进制的形式读取(即和底层发来的数据一致)。...
  • Mr_Dave
  • Mr_Dave
  • 2016-09-26 09:13:39
  • 734

MFC实现串口通信16进制发送接收

  • 2015年06月04日 10:43
  • 53.71MB
  • 下载

Android蓝牙通信,把硬件传过来的16进制的int数据转成16进制的string数据

关于Android与硬件(单片机或stm32)通信,由于硬件传过来的是16进制int数据,所以要把它转成16进制的string,否则显示的将是ASCII值。 本人写的是蓝牙通信,下面是读取硬件传过来的...
  • yzwty
  • yzwty
  • 2017-04-10 10:24:07
  • 1289
收藏助手
不良信息举报
您举报文章:JAVA十六进制数据接收与传输
举报原因:
原因补充:

(最多只允许输入30个字)