異或
- 代碼
- CRC8-ITU
- 例程
- 比較
- 計算
- CRC16
- 異或
- 改進
- 測試
- 重點
代碼
def fun_crc(datas):crc = 0xFF poly = 0x07 for i in range(len(datas)):for j in range(7, -1, -1):if (crc & 0x80) == 0x80: crc = (crc << 1) ^ polyelse:crc = (crc << 1)if (datas[i] & 2**j):#值為1的位再異或crc ^= polyreturn crc & 0xFF
與一般的CRC8有些不一樣。
CRC8-ITU
ITU的全稱是國際電信聯盟(International Telecommunication Union)。它是一個負責信息通信事務的聯合國專門機構,成立于1865年,總部位于瑞士日內瓦。
例程
def cal_crc(datas):crc = 0xFF #初始值poly = 0x07 # 多項式x^8 + x^2 + x^1 + 1,即0x107,省略了最高位1而得0x07for i in range(len(datas)):crc = (crc ^ datas[i]) & 0xFFfor j in range(8, 0, -1):if (crc & 0x80) == 0x80: # 判斷最高位是否為1,如果是需要異或,否則僅左移crc = (crc << 1) ^ polyelse:crc = (crc << 1)return crc & 0xFF # 計算后需要進行截取
比較
datas = [0xCB]
start = time.time()
print(hex(cal_crc(datas)))
print("一般循環冗余算法",time.time() - start)
start = time.time()
print(hex(fun_crc(datas)))
print("循環冗余算法",time.time() - start)
0x8c
一般循環冗余算法 0.013336658477783203
0x8c
循環冗余算法 0.00408172607421875
計算的結果是一樣的,用時還少一點。再用小學三年級上學期的除法算式算一下。
計算
![]() |
---|
不同之處會是多項式除法的一個性質嗎,或者是模二運算的性質?
CRC16
開始用的查表法,表里也只有256個元素。用上面兩種方式計算的時候要移一個字節,或者直接改成計算16位兩個字節。
異或
不一樣的是不異或,在計算時處理。可以把(datas[i] & 2**j)的判斷放到前面嗎?免得異或一次再異或回去。
改進
def fun2_crc(datas):crc = 0xFF #初始值poly = 0x07 # 多項式x^8 + x^2 + x^1 + 1,即0x107,省略了最高位1而得0x07for i in range(len(datas)):for j in range(7, -1, -1):if (datas[i] & 2**j):#與1異或要翻轉if (crc & 0x80) == 0x80: crc = (crc << 1)else:crc = (crc << 1) ^ polyelse:#0或1與0異或不翻轉if (crc & 0x80) == 0x80: crc = (crc << 1) ^ polyelse:crc = (crc << 1)return crc & 0xFF # 計算后需要進行截取
測試
datas = [0xCB]
for i in range(1000):datas.extend(random.sample(range(255),100))
print(len(datas))
start = time.time()
print(hex(cal_crc(datas))) # 輸出CRC8校驗碼
print("一般循環冗余算法",time.time() - start)
start = time.time()
print(hex(fun_crc(datas))) # 輸出CRC8校驗碼
print("循環冗余算法",time.time() - start)
start = time.time()
print(hex(fun2_crc(datas))) # 輸出CRC8校驗碼
print("改進循環冗余算法",time.time() - start)
把數據增加到十萬。打印
100001
0x27
一般循環冗余算法 0.04993319511413574
0x27
循環冗余算法 6.126452922821045
0x27
改進循環冗余算法 5.69709587097168
重點
0或1與0異或不翻轉,與1異或要翻轉。