@Tyhj
        
        2018-12-28T06:04:25.000000Z
        字数 2451
        阅读 1725
    Java
最近项目中发现和硬件通信时候出现了一些问题,所以仔细看了一下通信的时候的数据传输,在硬件协议上经常看见要求发送这样格式的数据;这个是十六进制的数据,怎么来构建这种数据来发送呢
55 AA 01 00 01 00 01
首先和硬件通信,我们一般是通过输入输出流来发送或者接收一个byte[]数组;首先我们得构建这个byte数组
简单的命令可以先拼接字符串,再把字符串转成byte数组
String hexStr="55AA0100010001";//16进制字符串转成byte[]byte[] bytes=hexStrToByteArray(hexStr);System.out.println(Arrays.toString(bytes));
打印出来的数据
[85, -86, 1, 0, 1, 0, 1]
十六进制字符串转成byte[]方法
public static byte[] hex2Bytes(final String data) throws Exception {final int len = data.length();if ((len & 0x01) != 0) {throw new Exception("Odd number of characters.");}final byte[] out = new byte[len >> 1];// two characters form the hex value.for (int i = 0, j = 0; j < len; i++) {int f = toDigit(data.charAt(j), j) << 4;j++;f = f | toDigit(data.charAt(j), j);j++;out[i] = (byte) (f & 0xFF);}return out;}
其实这个和字符串拼接是差不多的,byte[]的拼接方法
//java 合并两个byte[]public static byte[] byteMerger(byte[] byte1, byte[] byte2){byte[] byte3 = new byte[byte1.length+byte2.length];System.arraycopy(byte1, 0, byte3, 0, byte1.length);System.arraycopy(byte2, 0, byte3, byte1.length, byte2.length);return byte3;}//合并多个byte[]private static byte[] byteMergerAll(byte[]... values) {int length_byte = 0;for (int i = 0; i < values.length; i++) {length_byte += values[i].length;}byte[] all_byte = new byte[length_byte];int countLength = 0;for (int i = 0; i < values.length; i++) {byte[] b = values[i];System.arraycopy(b, 0, all_byte, countLength, b.length);countLength += b.length;}return all_byte;}
有一个问题,就是每个byte应该是十进制的,刚才十六进制字符串转成byte[]的方法,可以看到转后的byte数组是[85, -86, 1, 0, 1, 0, 1],55十进制就是85,   AA十进制就是170,一个byte为8位二进制,最大表示的数字是2^8 = 256,byte的取值范围是-128~127,-86就表示170可以简单理解为:256-170=86
所以比如AA需要转成170,再转为byte,(byte)170;或者直接写成byte(0xAA)也是可以的
public static final byte HEAD = 0xAA;
比如现在有个问题,55 AA 01 00 00 00 01,如果我中间三个00是用三位来表示一个数值的,这个时候用byte来拼接;首先十进制转十六进制
String hexStr = Integer.toHexString(100);
然后字符串再转成byte[],但是在转之前要保证hexStr长度为2的倍数,不足要先在前面加一个0; 
其实没有必要,byte[]保存的就是十进制,直接int转byte[]就好了
/*** int整数转换为4字节的byte数组** @param i* 整数* @return byte数组*/public static byte[] intToByte4(int i) {byte[] targets = new byte[4];targets[3] = (byte) (i & 0xFF);targets[2] = (byte) (i >> 8 & 0xFF);targets[1] = (byte) (i >> 16 & 0xFF);targets[0] = (byte) (i >> 24 & 0xFF);return targets;}/*** long整数转换为8字节的byte数组** @param lo* long整数* @return byte数组*/public static byte[] longToByte8(long lo) {byte[] targets = new byte[8];for (int i = 0; i < 8; i++) {int offset = (targets.length - 1 - i) * 8;targets[i] = (byte) ((lo >>> offset) & 0xFF);}return targets;}/*** short整数转换为2字节的byte数组** @param s* short整数* @return byte数组*/public static byte[] unsignedShortToByte2(int s) {byte[] targets = new byte[2];targets[0] = (byte) (s >> 8 & 0xFF);targets[1] = (byte) (s & 0xFF);return targets;}
推荐阅读:Android串口通信工具