Skip to content

Commit 18d19ae

Browse files
committed
2 parents 82bb6ba + 386181f commit 18d19ae

1 file changed

Lines changed: 91 additions & 0 deletions

File tree

15.algorithm/crc16.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
2+
CRC_LENGTH = 0x02
3+
4+
CRC16_TABLE = (
5+
0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,0xC601,
6+
0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440,0xCC01,0x0CC0,
7+
0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,0x0A00,0xCAC1,0xCB81,
8+
0x0B40,0xC901,0x09C0,0x0880,0xC841,0xD801,0x18C0,0x1980,0xD941,
9+
0x1B00,0xDBC1,0xDA81,0x1A40,0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,
10+
0x1DC0,0x1C80,0xDC41,0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,
11+
0x1680,0xD641,0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,
12+
0x1040,0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,
13+
0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,0x3C00,
14+
0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,0xFA01,0x3AC0,
15+
0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,0x2800,0xE8C1,0xE981,
16+
0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,0xEE01,0x2EC0,0x2F80,0xEF41,
17+
0x2D00,0xEDC1,0xEC81,0x2C40,0xE401,0x24C0,0x2580,0xE541,0x2700,
18+
0xE7C1,0xE681,0x2640,0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,
19+
0x2080,0xE041,0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,
20+
0x6240,0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,
21+
0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,0xAA01,
22+
0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,0x7800,0xB8C1,
23+
0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,0xBE01,0x7EC0,0x7F80,
24+
0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,0xB401,0x74C0,0x7580,0xB541,
25+
0x7700,0xB7C1,0xB681,0x7640,0x7200,0xB2C1,0xB381,0x7340,0xB101,
26+
0x71C0,0x7080,0xB041,0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,
27+
0x5280,0x9241,0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,
28+
0x5440,0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,
29+
0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,0x8801,
30+
0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,0x4E00,0x8EC1,
31+
0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,0x4400,0x84C1,0x8581,
32+
0x4540,0x8701,0x47C0,0x4680,0x8641,0x8201,0x42C0,0x4380,0x8341,
33+
0x4100,0x81C1,0x8081,0x4040
34+
)
35+
36+
""" Code to generate the CRC-16 lookup table:
37+
def generate_crc16_table():
38+
crc_table = []
39+
for byte in range(256):
40+
crc = 0x0000
41+
for _ in range(8):
42+
if (byte ^ crc) & 0x0001:
43+
crc = (crc >> 1) ^ 0xa001
44+
else:
45+
crc >>= 1
46+
byte >>= 1
47+
crc_table.append(crc)
48+
return crc_table
49+
"""
50+
51+
import struct
52+
53+
def crc16(data):
54+
crc = 0xFFFF
55+
for char in data:
56+
crc = (crc >> 8) ^ CRC16_TABLE[((crc) ^ char) & 0xFF]
57+
return struct.pack('<H', crc)
58+
#
59+
# test_bytes = b"\x01\x05\x00\x00\xFF\x00"
60+
# print(test_bytes)
61+
# crc = crc16(test_bytes)
62+
# print(hex(crc[0]), hex(crc[1]))
63+
64+
def PrintHex(string):
65+
tmp = string.split(" ")
66+
data = bytearray()
67+
for dt in tmp:
68+
# print(hex(int(dt, 16)))
69+
data.append(int(dt, 16))
70+
crc = crc16(data)
71+
data.append(crc[0])
72+
data.append(crc[1])
73+
return data
74+
75+
test_strs = "01 05 00 00 FF 00"
76+
77+
print(test_strs)
78+
79+
print(bytes(PrintHex(test_strs)))
80+
81+
print(b'\x01\x05\x00\x00\xff\x00\x8c\x3a')
82+
83+
test_strs = "01 05 00 0B FF 00" # FD F8
84+
85+
print(test_strs)
86+
87+
print(bytes(PrintHex(test_strs)))
88+
89+
recv = b'\x01\x05\x00\x00\xff\x00\x8c\x3a'
90+
91+
print(crc16(recv) == b'\x00\x00')

0 commit comments

Comments
 (0)