"CRC表的MATLAB生成代码"
生成的查找表可以用于快速计算 CRC 值,通过查表法可以显著提高 CRC 计算效率,尤其适用于需要处理大量数据的场景。
下面是一个生成 CRC 查找表(CRC Table)的 MATLAB 代码,该代码可以根据指定的多项式、位宽和初始值生成对应的 CRC 表:
这个函数可以生成各种常见的 CRC 查找表,如 CRC8、CRC16、CRC32 等。使用时需要指定以下参数:
poly
:CRC 多项式,以十六进制表示(例如,CRC32 的多项式是 0x04C11DB7)width
:CRC 的位宽(如 8、16、32)reflect_in
:输入数据是否需要字节翻转(1 表示翻转,0 表示不翻转)reflect_out
:输出结果是否需要翻转(1 表示翻转,0 表示不翻转)xor_out
:最终结果需要异或的值(通常为 0 或全 1)
示例用法(生成 CRC32 表):
crc32_table = generate_crc_table(0x04C11DB7, 32, 1, 1, 0xFFFFFFFF);
参考代码:
% https://zhuanlan.zhihu.com/p/396165368
% http://outputlogic.com/?page_id=321
% https://zhuanlan.zhihu.com/p/651214373
% https://blog.csdn.net/weixin_43517955/article/details/139132172?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-139132172-blog-148381867.235^v43^pc_blog_bottom_relevance_base1&spm=1001.2101.3001.4242.1&utm_relevant_index=3
% http://www.ip33.com/crc.html
% https://wavedrom.com/editor.html
% https://zhuanlan.zhihu.com/p/396165368% crc_table = generate_crc_table(0x11021, 16, 1, 1, 0);
% dat2 = dec2hex(crc_table.',4);
% dat2 = lower(dat2);function crc_table = generate_crc_table(poly, width, reflect_in, reflect_out, xor_out)% 生成CRC查找表% 输入参数:% poly - CRC多项式(十六进制)% width - CRC位宽(如8, 16, 32)% reflect_in - 输入是否翻转(1表示翻转, 0表示不翻转)% reflect_out - 输出是否翻转(1表示翻转, 0表示不翻转)% xor_out - 结果异或值(十六进制)% 输出参数:% crc_table - 生成的CRC查找表crc_table = zeros(1, 256);% 计算掩码,用于截取指定位宽的结果% mask = (1 << width) - 1;mask = bitshift(1, width)-1;for i = 0:255% 初始化当前值crc = i;% 如果输入需要翻转,则翻转输入字节if reflect_incrc = bitreverse(crc, 8);end% 将8位输入扩展到指定的CRC位宽% crc = crc << (width - 8);crc = bitshift(crc, width-8);% 处理8位数据for j = 1:8if bitget(crc, width)% 如果最高位为1,左移后与多项式异或crc = bitshift(crc, 1);crc = bitxor(crc, poly);else% 如果最高位为0,仅左移crc = bitshift(crc, 1);end% 保持在指定的位宽范围内crc = bitand(crc, mask);end% 如果输出需要翻转,则翻转结果if reflect_outcrc = bitreverse(crc, width);end% 与输出异或值进行异或操作crc = bitxor(crc, xor_out);% 存入查找表crc_table(i + 1) = crc;end
endfunction reversed = bitreverse(value, bits)% 翻转指定位数的二进制值reversed = 0;for i = 1:bitsreversed = bitshift(reversed, 1);reversed = bitor(reversed, bitand(value, 1));value = bitshift(value, -1);end
end