| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- package com.template.common.utils;
- public class CRCGenerator {
- /**
- * 计算CRC16校验码
- * @param bytes
- * 字节数组
- * @return {@link String} 校验码
- * @since 1.0
- */
- public static String getCRC(byte[] bytes) {
- // CRC寄存器全为1
- int CRC = 0x0000ffff;
- // 多项式校验值
- int POLYNOMIAL = 0x0000a001;
- int i, j;
- for (i = 0; i < bytes.length; i++) {
- CRC ^= ((int) bytes[i] & 0x000000ff);
- for (j = 0; j < 8; j++) {
- if ((CRC & 0x00000001) != 0) {
- CRC >>= 1;
- CRC ^= POLYNOMIAL;
- } else {
- CRC >>= 1;
- }
- }
- }
- // 结果转换为16进制
- String result = Integer.toHexString(CRC).toUpperCase();
- if (result.length() != 4) {
- StringBuffer sb = new StringBuffer("0000");
- result = sb.replace(4 - result.length(), 4, result).toString();
- }
- //高位在前地位在后
- //return result.substring(2, 4) + " " + result.substring(0, 2);
- // 交换高低位,低位在前高位在后
- return result.substring(2, 4) + result.substring(0, 2);
- }
- /**
- * CRC16(modbus)校验
- * 获取crc16校验码,参数data中不能有空格
- * @param data
- * @return
- */
- public static String getCRC16_Modbus_Str(String data) {
- //data = data.replace(" ", "");
- int len = data.length();
- if (!(len % 2 == 0)) {
- return "0000";
- }
- int num = len / 2;
- byte[] para = new byte[num];
- for (int i = 0; i < num; i++) {
- int value = Integer.valueOf(data.substring(i * 2, 2 * (i + 1)), 16);
- para[i] = (byte) value;
- }
- String data1 = getCRC(para).substring(0,2);
- String data2 = getCRC(para).substring(2);
- return data1+" "+data2;
- }
- public static void main(String[] args) {
- String data = "01 03 10 00 00 01";
- String crc = getCRC16_Modbus_Str(data);
- System.out.println("CRC-16: " + crc);
- }
- }
|