最近在用emqtt,程序中用到了一些数组的工具类,抽空整理了一下,欢迎补充!!!
1.关于crc16校验
/**
* CRC16校验(校验完整数组)
*
* @param buffer 待校验数组
* @return 校验结果
*/
public static byte[] modbusCrc16(byte[] buffer) {
return modbusCrc16(buffer, 0, buffer.length);
}
/**
* CRC16校验(校验部分数组)
*
* @param buffer 待校验数组
* @param startIndex 开始索引
* @param length 长度
* @return 校验结果2字节
*/
public static byte[] modbusCrc16(byte[] buffer, int startIndex, int length) {
int crc = 0xFFFF;
int crcPoly = 0xA001;
for (int i = 0; i < length; i++) {
if (buffer[i] < 0) {
crc ^= Integer.parseInt(Integer.toHexString(buffer[i] + 256), 16);
} else {
crc ^= buffer[startIndex + i];
}
for (int j = 0; j < 8; j++) {
int crcBit = (crc & 0x01);
crc >>= 1;
if (crcBit == 1) {
crc ^= crcPoly;
}
}
}
byte[] tempData = new byte[2];
tempData[0] = (byte) (crc & 0xFF);
tempData[1] = (byte) (crc >> 8);
return tempData;
}
2.16进制字节码与字符串的相互转换
/**
* byte数组转16进制String
*
* @param bytes byte数组
* @return 字符串
*/
public static String bytesToString(byte[] bytes) {
StringBuilder sum = new StringBuilder();
for (Byte aByte : bytes) {
if (aByte >= 0 && aByte <= 15) {
String s = Integer.toHexString(aByte);
sum.append("0").append(s);
} else if (aByte < 0) {
String s = Integer.toHexString(aByte + 256);
sum.append(s);
} else {
String s = Integer.toHexString(aByte);
sum.append(s);
}
}
return sum.toString();
}
/**
* byte集合转16进制String
*
* @param bytes byte数组
* @return 字符串
*/
public static String bytesToString(List<Byte> bytes) {
StringBuilder sum = new StringBuilder();
for (Byte aByte : bytes) {
String s = Integer.toHexString(aByte);
if (aByte >= 0 && aByte <= 15) {
sum.append("0").append(s);
} else if (aByte < 0) {
s = Integer.toHexString(aByte + 256);
sum.append(s);
} else {
sum.append(s);
}
}
return sum.toString();
}
/**
* 16进制字符串转byte[]
* @param hexString
* @return
*/
public static byte[] HexToByte(String hexString){
int len = hexString.length();
byte[] b = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
// 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
b[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character
.digit(hexString.charAt(i + 1), 16));
}
return b;
}
3.bcd码与数字字符串相互转换
/**
* byte集合转bcd码string
*
* @param bytes
* @return
*/
public static String bcdToString(List<Byte> bytes) {
StringBuilder sum = new StringBuilder();
for (Byte aByte : bytes) {
String temp = String.valueOf(aByte);
if (aByte >= 0 && aByte <= 9) {
sum.append("0").append(temp);
} else {
sum.append(temp);
}
}
return sum.toString();
}
/**
* byte数组转bcd码string
*
* @param bytes
* @return
*/
public static String bcdToString(byte[] bytes) {
StringBuilder sum = new StringBuilder();
for (Byte aByte : bytes) {
String temp = String.valueOf(aByte);
if (aByte >= 0 && aByte <= 9) {
sum.append("0").append(temp);
} else {
sum.append(temp);
}
}
return sum.toString();
}
/**
* 将数字字符串转换成BCD码的数组
* @param data 数字字符串
* @return
*/
public static byte[] String2BcdArray(String data) {
List<Byte> list = new ArrayList<>();
if (data.length() % 2 != 0) {
data = "0" + data;
}
for (int i = 0; i < data.length() / 2; i++) {
byte temp = (byte) ToBcd(ToInt32(data, i));
list.add(temp);
}
return toArray(list);
}
public static int ToInt32(String data, int i) {
String substring = data.substring(i * 2, i * 2 + 2);
return Integer.parseInt(substring);
}
public static int ToBcd(int a) {
int ret = 0, shl = 0;
while (a > 0) {
ret = ret | (a % 10) << shl;
a = a / 10;
shl = shl + 4;
}
return ret;
}
4.其他
/**
* 获取数字的字节数组
* @param value
* @return
*/
public static byte[] GetBytes(int value) {
ByteBuffer buffer = ByteBuffer.allocate(4).order(ByteOrder.nativeOrder());
buffer.putInt(value);
return buffer.array();
}
/**
* 将字节数组用0补齐至所需长度
* @param oldArray 原始字节数组
* @param length 所需长度
* @return
*/
public static byte[] PaddedLength(byte[] oldArray, int length) {
byte[] newArray = new byte[length];
if (oldArray.length < length) {
for (int i = 0; i < oldArray.length; i++) {
newArray[i + newArray.length - oldArray.length] = oldArray[i];
}
} else {
newArray = oldArray;
}
return newArray;
}
/**
* byte集合转byte数组
* @param list
* @return
*/
public static byte[] toArray(List<Byte> list) {
byte[] bytes = new byte[list.size()];
for (int i = 0; i < list.size(); i++) {
bytes[i] = list.get(i);
}
return bytes;
}