crc - CRC 查表优化是如何工作的?
问题描述
我试图通过以下方式了解 CRC 表查找优化:http: //www.sunshine2k.de/articles/coding/crc/understanding_crc.html#ch5,特别是:
public static ushort Compute_CRC16(byte[] bytes)
{
ushort crc = 0;
foreach (byte b in bytes)
{
/* XOR-in next input byte into MSB of crc, that's our new intermediate divident */
byte pos = (byte)( (crc >> 8) ^ b); /* equal: ((crc ^ (b << 8)) >> 8) */
/* Shift out the MSB used for division per lookuptable and XOR with the remainder */
crc = (ushort)((crc << 8) ^ (ushort)(crctable16[pos]));
}
return crc;
}
我确实了解基本的逐位方法,并且确实了解查找方法,但是我很难理解这一行:
crc = (ushort)((crc << 8) ^ (ushort)(crctable16[pos]));
为什么需要对现有的 crc 进行 rshift?为什么这个技巧有效?它的依据是什么?
谢谢。
PS:是的,我读了这个帖子:如何计算 CRC32 校验和?(这不是骗子,因为它描述了基本方法)
解决方案
这是一个左移CRC的例子。一个数据字节与 CRC 的高位字节进行异或运算。要进行查表(索引数组),需要将结果右移,或者可以先右移 CRC 的高位字节,然后与一个数据字节进行异或以产生新的中间高位字节的 CRC,则必须循环 8 次以产生循环 CRC 8 次的结果,或者这可以提前为所有 256 个可能的 8 位值完成,以生成表,并且可以使用表查找而不是骑自行车 8 次。在这个循环之后,低位字节需要左移,所以你最终得到了所示的代码。
左移 CRC 类似于在二进制中进行长手除法,使用 CRC 多项式作为除数,数据作为长被除数,只是使用 XOR 代替减法,最后的余数是 CRC。事实证明,一次异或 8 个数据(除数)位不会影响结果,因为每个商位仅基于 CRC 多项式的最高有效位和工作除数的当前最高有效位(数据),它允许优化使用表查找。
推荐阅读
- batch-file - 如何循环文本文件的每一行以使用 Windows 批处理文件进行打印?
- groovy - 无法从非 gui 模式运行 Jmeter 测试
- node.js - cloudinary 文件太大
- javascript - 如何将函数从一个文件导出到另一个 node.js?
- python - 错误 django-softdelete:命令出错,退出状态为 1:python setup.py egg_info 检查日志以获取完整的命令输出
- python - 使用python执行Mysql存储过程
- python-3.x - 如何将单线程代码转换为多线程代码
- arrays - SwiftUI中数组的值和标题列表
- javascript - Javascript:如何更改 URL 中的路径名
- jbpm - 在 JBPM 脚本任务中,我可以访问流程变量的最后更新信息吗