學習途中遇到了很多想不通的地方,花了很多天才明白。
現在記錄在學習途中對某些我認爲比較難理解的內容進行進一步的解釋,希望能加快理解的速度。
以CRC16-CCITT(1021)爲例,提供JAVA版的 CRC bit生成與CRC 表的生成與查表的原理。
整個程序:
crc16:
從上面的程序中( value = ((value << 1) + b) ^ 0x1021; )可以看出爲什麼簡記1021。
表的生成原理:將低位統一認爲是0,高位的值爲索引,餘數存儲表中.
資料上都是個這樣的公式: a ^ b ^ c = a ^ ( b ^ c ) .
可以理解成這樣(16位):
11001100 11001100 ^ 0x1021
=
11001100 00000000 ^ 00000000 11001100 ^ 0x1021
這樣就可以以字節爲單位,拿高位出來跟多項式做異或求得餘數保存到表中。
程序:createTable()以字節爲單位創建的crc16表。
例子: 11001100 11001100 ^ 0x1021 (已經生成一張存儲着0-255的表 table)
= 11001100 00000000 ^ 0x1021 ^ 00000000 11001100
= table[11001100] ^ 00000000 11001100 s
查表法的原理: 當前餘數的低位加上當前字節,異或上次的餘數。
很繞口,我當初就是載在這了,看了幾天都不明白。
程序:getCrc()就是查表的實現。
例子: 00000001 00000002 00000003 ^ 0x1021; crc = 0;
數據擴充16位(crc16) 00000001 00000002 00000003 00000000 00000000 ^ 0x1021;
第一步執行完後 00000000 ^ 00000001 ^ tsable[00000000]; 得餘數crc = 00000001;
第二步執行完後 00000001 00000000(左移後) ^ 00000002 ^ table[00000000]; 得餘數crc = 00000001 00000002
第三步執行完後 00000002 00000000 ^ 00000003 ^ table[00000001] 得餘數 crc = 00000002 00000003 ^ table[1]
最後得餘數 24881