最近在用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; }