Crc
CRC-16-IBM,反向 0xA001,小端 (DCBA) 實現
背景
我需要在 Node.js 中實現這個算法,但是在到處搜尋之後我找不到實現。
程式碼
我的第一種方法由 StackOverflow 的一名成員審查並被認為是正確的:
但是,它不適用於測試向量。所以在這一點上,我假設我錯過或錯過了一些解釋,並且我實施了錯誤的算法。
問題
- 在哪裡可以找到 CRC-16-IBM、Reversed 0xA001、Little Endian (DCBA) 的實現?
- 有沒有辦法知道給定 N 個測試向量正在使用哪種算法來創建 CRC?
PS:如果是Javascript,完美,如果不是,我可以轉換它。
測試訊息:
00000000000000C1080500000164880D438001014CC5F918ACC14200000000000000F00301F00002B60000430E8B000000000164880C68C000014CC5F918ACC14200000000000000000301F00102B60000430E97000000000164880CA35800014CC5F918ACC14200000000000000000301F00102B60000430E99000000000164880CDDF000014CC5F918ACC14200000000000000000301F00102B60000430E99000000000164880D188800014CC5F918ACC14200000000000000000301F00102B60000430E98000005 00008DC5
此消息的 CRC:
00008DC5
CRC-16 多項式
0xCD83
將生成數據的字節交換校驗和。它在以下 C++ 常式中實現:uint16_t crc16(uint16_t state, uint8_t byte) { uint16_t mask; uint16_t crc = state ^ uint16_t(byte); for (int j = 7; j >= 0; j--) { mask = -(crc & uint16_t(1)); crc = (crc >> 1) ^ (mask & uint16_t(0xCD83)); } return crc; }
如果您初始化
state=0
並將此常式提供給您的測試向量state = crc(state, data[i]);
然後在處理之後
state
將等於0xC58D
您想要的字節交換校驗和。沒有 16 位多項式會產生具有其他字節順序 (
0x8DC5
) 的校驗和。