我已经提到了hackersdelight的CRC32实现,我只是从那里编辑了crc32h
函数,并让它得到一个字节并更新最后一个CRC32值。因为我需要用新的byte
输入来计算新的CRC32值。我可以通过向它发送一个数组来获得它的工作,因为在调用CRC32函数之前我无法将我的整个数据保存到数组中。所以我想更新前一个字节计算出的最后一个CRC32值。这里是黑客的实现:更新C中的CRC32值
unsigned int crc32h(unsigned char *message) {
int i, crc;
unsigned int byte, c;
const unsigned int g0 = 0xEDB88320, g1 = g0>>1,
g2 = g0>>2, g3 = g0>>3, g4 = g0>>4, g5 = g0>>5,
g6 = (g0>>6)^g0, g7 = ((g0>>6)^g0)>>1;
i = 0;
crc = 0xFFFFFFFF;
while ((byte = message[i]) != 0) { // Get next byte.
crc = crc^byte;
c = ((crc<<31>>31) & g7)^((crc<<30>>31) & g6)^
((crc<<29>>31) & g5)^((crc<<28>>31) & g4)^
((crc<<27>>31) & g3)^((crc<<26>>31) & g2)^
((crc<<25>>31) & g1)^((crc<<24>>31) & g0);
crc = ((unsigned)crc >> 8)^c;
i = i + 1;
}
return ~crc;
}
以下是我编辑的功能。
unsigned int crc32h(uint8_t byte,int crc) {
unsigned int c;
const unsigned int g0 = 0xEDB88320, g1 = g0>>1,
g2 = g0>>2, g3 = g0>>3, g4 = g0>>4, g5 = g0>>5,
g6 = (g0>>6)^g0, g7 = ((g0>>6)^g0)>>1;
crc = crc^byte;
c = ((crc<<31>>31) & g7)^((crc<<30>>31) & g6)^
((crc<<29>>31) & g5)^((crc<<28>>31) & g4)^
((crc<<27>>31) & g3)^((crc<<26>>31) & g2)^
((crc<<25>>31) & g1)^((crc<<24>>31) & g0);
crc = ((unsigned)crc >> 8)^c;
crc = ~crc;
return crc;
}
此代码计算CRC32值成功,如果我发送一个字节和default CRC value (0xFFFFFFFF)
。但我无法更新CRC,例如:
int crc = 0xFFFFFFFF;
crc = crc32h(0x11,crc); //This gives me the correct CRC32 for `0x11`
crc = crc32h(0x22,crc); //But this does not give me the correct CRC32 for `0x1122`
为什么它不更新有关以前CRC值的新CRC值?
我想,如果你拨打电话' crc = crc32h(0x22,〜crc)',它会做你想做的。 –
@JimMischel这也有效,但它需要以'0'而不是'0xFFFFFFFF'开头。 –
是的,我发表了这个评论,并且在马丁贴出他的评论时正在写一个答案。 –