2 回答

TA貢獻1806條經驗 獲得超8個贊
還有不止一個 CRC-16。22 編目在http://reveng.sourceforge.net/crc-catalogue/16.htm。CRC 的特征在于其寬度、多項式、初始狀態以及輸入和輸出位順序。
通過將相同的數據應用于您的每個函數:
Python:
data = bytes([0x01, 0x23, 0x45, 0x67, 0x89])
print ( hex(crc16(data)) )
結果:0x738E
C:
char data[] = {0x01, 0x23, 0x45, 0x67, 0x89};
printf ("%4X\n", get_crc16 (data, sizeof (data), 0xffffu));
結果:0x9F0D
并將相同的數據應用于生成多個 CRC 的在線工具,例如https://crccalc.com/ ,您可以從結果中識別 CRC。
在這種情況下,您的 Python 代碼是CRC-16-CCITT-FALSE,而 C 結果匹配CRC-16/MCRF4XX。它們都具有相同的多項式,但輸入反射和輸出反射參數不同(CCITT 為假,MCRF4XX 為真)。這意味著對于 MCRF4XX,首先從 LSB 讀取位,并且整個 CRC 在輸出時不反轉。
https://pypi.org/project/crccheck/支持 CCITT 和 MCRF4XX 以及許多其他。

TA貢獻1780條經驗 獲得超1個贊
我基于python crc16 lib在C中實現了一個crc16版本。這個庫計算CRC16 的 CRC-CCITT (XModem) 變體。我在 stm32l4 固件中使用了我的實現。這是我的 C 實現:
unsigned short _crc16(char *data_p, unsigned short length){
unsigned int crc = 0;
unsigned char i;
for(i = 0; i < length; i++){
crc = ((crc<<8)&0xff00) ^ CRC16_XMODEM_TABLE[((crc>>8)&0xff)^data_p[i]];
}
return crc & 0xffff;
}
在Python 端,我正在讀取 stm32 傳輸的 18 個字節。這是我的一些代碼(crc 的部分):
import crc16
# read first time
crc_buffer = b''
bytes = serial_comunication.read(2) # int_16 - 2 bytes
crc_buffer = crc_buffer.join([crc_buffer,bytes])
crc = crc16.crc16xmodem(crc_buffer,0)
while aux < 8:
crc_buffer = b''
bytes = serial_comunication.read(2)
crc_buffer = crc_buffer.join([crc_buffer,bytes])
crc = crc16.crc16xmodem(crc_buffer,crc)
print(crc)
在我的測試中,C 和 Python 的 crc16 值始終匹配,除非出現某些連接問題。希望這對某人有幫助!
添加回答
舉報