@Tyhj
2018-12-28T14:04:25.000000Z
字数 2451
阅读 1473
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串口通信工具