我不得不在我正在使用的系统上替换CRC32实现,这是在使用256大小查找表之前实现的算法,而且这个算法太大而无法在引导加载程序中使用。我实现的新算法使用16号查找表。
我使用的是与之前相同的多项式,但结果不同。在线计算器会产生更多随机结果,并且大多数都不清楚它们在做什么,即它们使用哪种多项式,输入数据的格式是什么,或者初始crc值是什么。
有谁知道在哪里可以找到CRC32实现的可靠,标准化的测试向量?
谢谢!
答案 0 :(得分:3)
是的,this catalog of CRCs。每个CRC定义都包含一个check
值 - 这是CRC输出的ASCII / UTF-8中的9字节字符串“123456789”。例如,CRC-32(“123456789”,9)= 0xcbf43926。
为什么不简单地将新实现与旧实现进行比较?
答案 1 :(得分:1)
没有标准化,只是为了方便而收集:
// Trivial one.
UINT32_C(0x00000000), ""
// Source: https://rosettacode.org/wiki/CRC-32
UINT32_C(0x414FA339), "The quick brown fox jumps over the lazy dog"
// Source: http://cryptomanager.com/tv.html
UINT32_C(0x9BD366AE), "various CRC algorithms input data"
// Source: http://www.febooti.com/products/filetweak/members/hash-and-crc/test-vectors/
UINT32_C(0x0C877F61), "Test vector from febooti.com"
如果您的结果不匹配怎么办?请务必检查您正在实施和比较的CRC的风格, - 这种挖掘的一个很好的例子可以在“CRC32 Checksums; The Good, The Bad, And The Ugly”文章中找到,其中显示某些程序可能在其他相同的操作之后进行额外的处理,例如通过校验和来管理消息的长度,可能或可能不在文档中。
答案 2 :(得分:0)
Ironclad存储库中有一些可能有用的测试向量:
;;; standard tests for crc32
(:digest-test #a"" #h"00000000")
(:digest-test #a"a" #h"e8b7be43")
(:digest-test #a"abc" #h"352441c2")
(:digest-test #a"message digest" #h"20159d7f")
(:digest-test #a"abcdefghijklmnopqrstuvwxyz" #h"4c2750bd")
(:digest-test #a"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" #h"1fc2e6d2")
(:digest-test #a"12345678901234567890123456789012345678901234567890123456789012345678901234567890" #h"7ca94a72")
https://github.com/froydnj/ironclad/blob/master/testing/test-vectors/crc32.testvec