在消息成幀方案中,我希望通過CRC錯誤檢測來保護數據包。這些數據包通過TCP連接發送。將CRC32值減少爲16或8位
對於長度小於16字節的小包,我會選擇CRC8。對於小於4096字節的數據包,使用CRC16算法。對於大數據包CRC32算法。
由於硬件支持(至少在某些Intel CPU上),目前最有吸引力的CRC實現是CRC32C。但是對於8bit和16bit CRC沒有特別的說明。
我現在的問題是:是否有可能將CRC32C算法的32位值減少到16位或8位值,而不會影響與本地CRC16或CRC8算法相比的錯誤檢測性能?
一個例子:
char buffer[256];
...
uint32_t crc32 = compute_crc32c_of_block(buffer, 256);
uint16_t fake_crc16 = (crc32 >> 16)^crc32;
uint8_t fake_crc8 = (fake_crc16 >> 8)^fake_crc16;
是fake_crc8作爲一個真正的CRC8落實好?
在此先感謝。
有趣的問題。我只是想知道,減少3個字節的有效載荷大小是否真的具有投資回報?考慮到處理特殊情況的運行時影響(我假設你將有不同的結構定義),字節對齊而不是雙字對齊等。 –
是的,數據包是字節對齊的,但是成員的內部偏移符合相應數據類型的要求。對於報頭壓縮,一些(主要是信令)報文可能會縮小至2字節,使用額外的4字節校驗值對於這些看起來有點過分。該協議應該在慢速移動連接上使用最小的成幀開銷,即GSM,其中所有帶寬應該給予實際有效載荷。 –