crc(Cyclic Redundancy Check):循環(huán)冗余校驗璃搜,是一種常用的查錯校驗碼径筏。本質是在要發(fā)送的信息后面附加一個校驗碼(均為二進制序列)。
實現步驟
- 選擇合適的生成多項式
- 將原始信息左移生成多項式階數減一位
- 將左移后的信息與生成多項式模二相除得到余數尸变,余數即校驗碼(校驗碼位數比生成多項式階數小一夹纫,高位0不能省略)
- 將檢驗碼附加在原信息后
源代碼
類文件
class CRC:
"""循環(huán)冗余檢驗
parameters
----------
info : list
需要被編碼的信息
crc_n : int, default: 32
生成多項式的階數
p : list
生成多項式
q : list
crc后得到的商
check_code : list
crc后得到的余數,即計算得到的校驗碼
code : list
最終的編碼
----------
"""
def __init__(self, info, crc_n=32):
self.info = info
# 初始化生成多項式p
loc = [32, 26, 23, 22, 16, 12, 11, 10, 8, 7, 5, 2, 1, 0]
if crc_n == 8:
loc = [8, 2, 1, 0]
elif crc_n == 16:
loc = [16, 15, 2, 0]
p = [0 for i in range(crc_n + 1)]
for i in loc:
p[i] = 1
info = self.info.copy()
times = len(info)
n = crc_n + 1
# 左移補零
for i in range(crc_n):
info.append(0)
# 除
q = []
for i in range(times):
if info[i] == 1:
q.append(1)
for j in range(n):
info[j + i] = info[j + i] ^ p[j]
else:
q.append(0)
# 余數
check_code = info[-crc_n::]
# 生成編碼
code = self.info.copy()
for i in check_code:
code.append(i)
self.crc_n = crc_n
self.p = p
self.q = q
self.check_code = check_code
self.code = code
def print_format(self):
"""格式化輸出結果"""
print('{:10}\t{}'.format('信息:', self.info))
print('{:10}\t{}'.format('生成多項式:', self.p))
print('{:10}\t{}'.format('商:', self.q))
print('{:10}\t{}'.format('余數:', self.check_code))
print('{:10}\t{}'.format('編碼:', self.code))
測試代碼
import numpy as np
# 隨機信息
m = np.random.randint(0, 2, 10)
m = list(m)
crc = CRC(m, 32)
crc.print_format()
輸出
信息: [1, 1, 1, 1, 1, 1, 0, 1, 1, 0]
生成多項式: [1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1]
商: [1, 0, 0, 1, 0, 1, 1, 0, 0, 0]
余數: [1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0]
編碼: [1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0]