zuoxiao
2024-03-04 275fbc47873d5c4f78a57b4fa58a08e2e7af2dc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package com.dayu.recharge.utils;
 
import com.dayu.recharge.tools.HexUtil;
 
import java.util.Arrays;
 
/**
 * Copyright (C), 2022,
 * Author: zuo
 * Date: 2022/2/7 22:54
 * Description:
 */
public class CRC8 {
 
    private final static byte[] CHECKSUM_TABLE = {(byte) 0x00, (byte) 0x07, (byte) 0x0e, (byte) 0x09, (byte) 0x1c, (byte) 0x1b,
            (byte) 0x12, (byte) 0x15, (byte) 0x38, (byte) 0x3f, (byte) 0x36, (byte) 0x31, (byte) 0x24, (byte) 0x23, (byte) 0x2a,
            (byte) 0x2d, (byte) 0x70, (byte) 0x77, (byte) 0x7e, (byte) 0x79, (byte) 0x6c, (byte) 0x6b, (byte) 0x62, (byte) 0x65,
            (byte) 0x48, (byte) 0x4f, (byte) 0x46, (byte) 0x41, (byte) 0x54, (byte) 0x53, (byte) 0x5a, (byte) 0x5d, (byte) 0xe0,
            (byte) 0xe7, (byte) 0xee, (byte) 0xe9, (byte) 0xfc, (byte) 0xfb, (byte) 0xf2, (byte) 0xf5, (byte) 0xd8, (byte) 0xdf,
            (byte) 0xd6, (byte) 0xd1, (byte) 0xc4, (byte) 0xc3, (byte) 0xca, (byte) 0xcd, (byte) 0x90, (byte) 0x97, (byte) 0x9e,
            (byte) 0x99, (byte) 0x8c, (byte) 0x8b, (byte) 0x82, (byte) 0x85, (byte) 0xa8, (byte) 0xaf, (byte) 0xa6, (byte) 0xa1,
            (byte) 0xb4, (byte) 0xb3, (byte) 0xba, (byte) 0xbd, (byte) 0xc7, (byte) 0xc0, (byte) 0xc9, (byte) 0xce, (byte) 0xdb,
            (byte) 0xdc, (byte) 0xd5, (byte) 0xd2, (byte) 0xff, (byte) 0xf8, (byte) 0xf1, (byte) 0xf6, (byte) 0xe3, (byte) 0xe4,
            (byte) 0xed, (byte) 0xea, (byte) 0xb7, (byte) 0xb0, (byte) 0xb9, (byte) 0xbe, (byte) 0xab, (byte) 0xac, (byte) 0xa5,
            (byte) 0xa2, (byte) 0x8f, (byte) 0x88, (byte) 0x81, (byte) 0x86, (byte) 0x93, (byte) 0x94, (byte) 0x9d, (byte) 0x9a,
            (byte) 0x27, (byte) 0x20, (byte) 0x29, (byte) 0x2e, (byte) 0x3b, (byte) 0x3c, (byte) 0x35, (byte) 0x32, (byte) 0x1f,
            (byte) 0x18, (byte) 0x11, (byte) 0x16, (byte) 0x03, (byte) 0x04, (byte) 0x0d, (byte) 0x0a, (byte) 0x57, (byte) 0x50,
            (byte) 0x59, (byte) 0x5e, (byte) 0x4b, (byte) 0x4c, (byte) 0x45, (byte) 0x42, (byte) 0x6f, (byte) 0x68, (byte) 0x61,
            (byte) 0x66, (byte) 0x73, (byte) 0x74, (byte) 0x7d, (byte) 0x7a, (byte) 0x89, (byte) 0x8e, (byte) 0x87, (byte) 0x80,
            (byte) 0x95, (byte) 0x92, (byte) 0x9b, (byte) 0x9c, (byte) 0xb1, (byte) 0xb6, (byte) 0xbf, (byte) 0xb8, (byte) 0xad,
            (byte) 0xaa, (byte) 0xa3, (byte) 0xa4, (byte) 0xf9, (byte) 0xfe, (byte) 0xf7, (byte) 0xf0, (byte) 0xe5, (byte) 0xe2,
            (byte) 0xeb, (byte) 0xec, (byte) 0xc1, (byte) 0xc6, (byte) 0xcf, (byte) 0xc8, (byte) 0xdd, (byte) 0xda, (byte) 0xd3,
            (byte) 0xd4, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x60, (byte) 0x75, (byte) 0x72, (byte) 0x7b, (byte) 0x7c,
            (byte) 0x51, (byte) 0x56, (byte) 0x5f, (byte) 0x58, (byte) 0x4d, (byte) 0x4a, (byte) 0x43, (byte) 0x44, (byte) 0x19,
            (byte) 0x1e, (byte) 0x17, (byte) 0x10, (byte) 0x05, (byte) 0x02, (byte) 0x0b, (byte) 0x0c, (byte) 0x21, (byte) 0x26,
            (byte) 0x2f, (byte) 0x28, (byte) 0x3d, (byte) 0x3a, (byte) 0x33, (byte) 0x34, (byte) 0x4e, (byte) 0x49, (byte) 0x40,
            (byte) 0x47, (byte) 0x52, (byte) 0x55, (byte) 0x5c, (byte) 0x5b, (byte) 0x76, (byte) 0x71, (byte) 0x78, (byte) 0x7f,
            (byte) 0x6a, (byte) 0x6d, (byte) 0x64, (byte) 0x63, (byte) 0x3e, (byte) 0x39, (byte) 0x30, (byte) 0x37, (byte) 0x22,
            (byte) 0x25, (byte) 0x2c, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x08, (byte) 0x0f, (byte) 0x1a, (byte) 0x1d,
            (byte) 0x14, (byte) 0x13, (byte) 0xae, (byte) 0xa9, (byte) 0xa0, (byte) 0xa7, (byte) 0xb2, (byte) 0xb5, (byte) 0xbc,
            (byte) 0xbb, (byte) 0x96, (byte) 0x91, (byte) 0x98, (byte) 0x9f, (byte) 0x8a, (byte) 0x8d, (byte) 0x84, (byte) 0x83,
            (byte) 0xde, (byte) 0xd9, (byte) 0xd0, (byte) 0xd7, (byte) 0xc2, (byte) 0xc5, (byte) 0xcc, (byte) 0xcb, (byte) 0xe6,
            (byte) 0xe1, (byte) 0xe8, (byte) 0xef, (byte) 0xfa, (byte) 0xfd, (byte) 0xf4, (byte) 0xf3};
 
 
    /**
     * 将十六进制的字符串转换成字节数组
     */
    public static byte[] hexStrToBinaryStr(String hexString) {
        try {
            hexString = hexString.replaceAll(" ", "");
            if ((hexString.length() % 2) != 0) {
                LogUtil.e("长度不是偶数");
            }
            int len = hexString.length();
            int index = 0;
            byte[] bytes = new byte[len / 2];
            while (index < len) {
                String sub = hexString.substring(index, index + 2);
                bytes[index / 2] = (byte) Integer.parseInt(sub, 16);
                index += 2;
            }
            return bytes;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new byte[0];
    }
 
 
    /**
     * 将十六进制的字符串 求出 CRC 8 的 CRC_H CRC_L
     */
    public static String getCRC8(String msg) {
 
        //十六进制的字符串转换成字节数组
        byte[] bytes = hexStrToBinaryStr(msg);
        //计算CRC8
        byte crc8 = CRC8(bytes, 0, bytes.length);
        String crc8ToStr = "" + Integer.toHexString(0xff & crc8);
        return crc8ToStr;
    }
 
    /**
     * 将十六进制的字符串 求出 CRC 8 的 CRC_H CRC_L
     */
    public static String getCRC8(byte[] msg) {
        String crc8ToStr = "";
        if (msg != null && msg.length != 0) {
            //计算CRC8
            byte crc8 = CRC8(msg, 0, msg.length);
            crc8ToStr = HexUtil.byteToHex(crc8); //+ Integer.toHexString(0xff & crc8);
        }
 
        return crc8ToStr;
    }
 
 
    public static boolean isCRC8(String readData) {
        readData = readData.replace(" ", "");
        String crcData = readData.substring(0, readData.length() - 4);
        //十六进制的字符串转换成字节数组
        byte[] bytes = hexStrToBinaryStr(crcData);
        //计算CRC8
        byte crc8 = CRC8(bytes, 0, bytes.length);
        String crc8ToStr = "" + Integer.toHexString(0xff & crc8);
        return crc8ToStr.equalsIgnoreCase(readData.substring(readData.length() - 4, readData.length() - 2));
    }
 
 
    public static boolean isCRC8(byte[] byteBase) {
        byte crc8Byte = byteBase[byteBase.length - 2];
        byte[] byteData = Arrays.copyOfRange(byteBase, 0, byteBase.length - 2);
        //计算CRC8
        byte crc8 = CRC8(byteData, 0, byteData.length);
 
        return crc8 == crc8Byte;
    }
 
    /**
     * CRC8 校验 多项式  x8+x2+x+1
     *
     * @param b
     * @param off
     * @param len
     * @return
     */
    public static byte CRC8(final byte[] b, final int off, final int len) {
        byte result = 0x00;
        for (int i = 0; i < len; i++) {
            result = CHECKSUM_TABLE[(result ^ (b[i + off] & 0xFF)) & 0xFF];
        }
        return (byte) (result & 0xFFL);
    }
 
 
}