|
|
@ -0,0 +1,139 @@
|
|
|
|
|
|
|
|
package com.common.commonlib.serialport;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 串口数据转换工具类
|
|
|
|
|
|
|
|
* Created by Administrator on 2016/6/2.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public class DataUtils {
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
|
|
|
|
// 判断奇数或偶数,位运算,最后一位是1则为奇数,为0是偶数
|
|
|
|
|
|
|
|
public static int isOdd(int num) {
|
|
|
|
|
|
|
|
return num & 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
|
|
|
|
//Hex字符串转int
|
|
|
|
|
|
|
|
public static int HexToInt(String inHex) {
|
|
|
|
|
|
|
|
return Integer.parseInt(inHex, 16);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static String IntToHex(int intHex){
|
|
|
|
|
|
|
|
return Integer.toHexString(intHex);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
|
|
|
|
//Hex字符串转byte
|
|
|
|
|
|
|
|
public static byte HexToByte(String inHex) {
|
|
|
|
|
|
|
|
return (byte) Integer.parseInt(inHex, 16);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
|
|
|
|
//1字节转2个Hex字符
|
|
|
|
|
|
|
|
public static String Byte2Hex(Byte inByte) {
|
|
|
|
|
|
|
|
return String.format("%02x", new Object[]{inByte}).toUpperCase();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
|
|
|
|
//字节数组转转hex字符串
|
|
|
|
|
|
|
|
public static String ByteArrToHex(byte[] inBytArr) {
|
|
|
|
|
|
|
|
StringBuilder strBuilder = new StringBuilder();
|
|
|
|
|
|
|
|
for (byte valueOf : inBytArr) {
|
|
|
|
|
|
|
|
strBuilder.append(Byte2Hex(Byte.valueOf(valueOf)));
|
|
|
|
|
|
|
|
strBuilder.append(" ");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return strBuilder.toString();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
|
|
|
|
//字节数组转转hex字符串,可选长度
|
|
|
|
|
|
|
|
public static String ByteArrToHex(byte[] inBytArr, int offset, int byteCount) {
|
|
|
|
|
|
|
|
StringBuilder strBuilder = new StringBuilder();
|
|
|
|
|
|
|
|
int j = byteCount;
|
|
|
|
|
|
|
|
for (int i = offset; i < j; i++) {
|
|
|
|
|
|
|
|
strBuilder.append(Byte2Hex(Byte.valueOf(inBytArr[i])));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return strBuilder.toString();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
|
|
|
|
//转hex字符串转字节数组
|
|
|
|
|
|
|
|
public static byte[] HexToByteArr(String inHex) {
|
|
|
|
|
|
|
|
byte[] result;
|
|
|
|
|
|
|
|
int hexlen = inHex.length();
|
|
|
|
|
|
|
|
if (isOdd(hexlen) == 1) {
|
|
|
|
|
|
|
|
hexlen++;
|
|
|
|
|
|
|
|
result = new byte[(hexlen / 2)];
|
|
|
|
|
|
|
|
inHex = "0" + inHex;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
result = new byte[(hexlen / 2)];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
int j = 0;
|
|
|
|
|
|
|
|
for (int i = 0; i < hexlen; i += 2) {
|
|
|
|
|
|
|
|
result[j] = HexToByte(inHex.substring(i, i + 2));
|
|
|
|
|
|
|
|
j++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 按照指定长度切割字符串
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param inputString 需要切割的源字符串
|
|
|
|
|
|
|
|
* @param length 指定的长度
|
|
|
|
|
|
|
|
* @return
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static List<String> getDivLines(String inputString, int length) {
|
|
|
|
|
|
|
|
List<String> divList = new ArrayList<>();
|
|
|
|
|
|
|
|
int remainder = (inputString.length()) % length;
|
|
|
|
|
|
|
|
// 一共要分割成几段
|
|
|
|
|
|
|
|
int number = (int) Math.floor((inputString.length()) / length);
|
|
|
|
|
|
|
|
for (int index = 0; index < number; index++) {
|
|
|
|
|
|
|
|
String childStr = inputString.substring(index * length, (index + 1) * length);
|
|
|
|
|
|
|
|
divList.add(childStr);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (remainder > 0) {
|
|
|
|
|
|
|
|
String cStr = inputString.substring(number * length, inputString.length());
|
|
|
|
|
|
|
|
divList.add(cStr);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return divList;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 计算长度,两个字节长度
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param val value
|
|
|
|
|
|
|
|
* @return 结果
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static String twoByte(String val) {
|
|
|
|
|
|
|
|
if (val.length() > 4) {
|
|
|
|
|
|
|
|
val = val.substring(0, 4);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
int l = 4 - val.length();
|
|
|
|
|
|
|
|
for (int i = 0; i < l; i++) {
|
|
|
|
|
|
|
|
val = "0" + val;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return val;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 校验和
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param cmd 指令
|
|
|
|
|
|
|
|
* @return 结果
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public static String sum(String cmd) {
|
|
|
|
|
|
|
|
List<String> cmdList = DataUtils.getDivLines(cmd, 2);
|
|
|
|
|
|
|
|
int sumInt = 0;
|
|
|
|
|
|
|
|
for (String c : cmdList) {
|
|
|
|
|
|
|
|
sumInt += DataUtils.HexToInt(c);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
String sum = DataUtils.IntToHex(sumInt);
|
|
|
|
|
|
|
|
sum = DataUtils.twoByte(sum);
|
|
|
|
|
|
|
|
cmd += sum;
|
|
|
|
|
|
|
|
return cmd.toUpperCase();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|