#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef unsigned uint;
uint crc32(const char* data,int size,uint crc=0) {
crc=~crc;
for(int i=0;i<size;i++) {
crc^=data[i]&255;
for(int j=0;j<8;j++) crc=crc>>1^0xEDB88320&-(crc&1);
}
return ~crc;
}
int main(int argc, char const *argv[]) {
enum { n=10 };
char payload[n+4];
srandom(time(0)); for(int i=0;i<n;i++) payload[i]=random();
uint payload_crc=crc32(payload,n);
printf("crc(payload)=%08X\n",payload_crc);
uint x=0x624D8C3;
char xd[4]={x,x>>8,x>>16,x>>24};
uint xd_crc=crc32(xd,4);
uint suffix=payload_crc^x;
payload[n ]=suffix;
payload[n+1]=suffix>>8;
payload[n+2]=suffix>>16;
payload[n+3]=suffix>>24;
uint crc=crc32(payload,n+4);
printf("crc(data )=%08X\n",crc);
printf("crc(x )=%08X\n",xd_crc);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KCnR5cGVkZWYgdW5zaWduZWQgdWludDsKdWludCBjcmMzMihjb25zdCBjaGFyKiBkYXRhLGludCBzaXplLHVpbnQgY3JjPTApIHsKCWNyYz1+Y3JjOwoJZm9yKGludCBpPTA7aTxzaXplO2krKykgeyAKCQljcmNePWRhdGFbaV0mMjU1OwoJCWZvcihpbnQgaj0wO2o8ODtqKyspIGNyYz1jcmM+PjFeMHhFREI4ODMyMCYtKGNyYyYxKTsgCgl9CglyZXR1cm4gfmNyYzsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QgKmFyZ3ZbXSkgewoJZW51bSB7IG49MTAgfTsKCWNoYXIgcGF5bG9hZFtuKzRdOwoJc3JhbmRvbSh0aW1lKDApKTsgZm9yKGludCBpPTA7aTxuO2krKykgcGF5bG9hZFtpXT1yYW5kb20oKTsKCQoJdWludCBwYXlsb2FkX2NyYz1jcmMzMihwYXlsb2FkLG4pOwoJcHJpbnRmKCJjcmMocGF5bG9hZCk9JTA4WFxuIixwYXlsb2FkX2NyYyk7CgoJdWludCB4PTB4NjI0RDhDMzsgCgljaGFyIHhkWzRdPXt4LHg+PjgseD4+MTYseD4+MjR9OwoJdWludCB4ZF9jcmM9Y3JjMzIoeGQsNCk7Cgl1aW50IHN1ZmZpeD1wYXlsb2FkX2NyY154OwoJcGF5bG9hZFtuICBdPXN1ZmZpeDsKCXBheWxvYWRbbisxXT1zdWZmaXg+Pjg7CglwYXlsb2FkW24rMl09c3VmZml4Pj4xNjsKCXBheWxvYWRbbiszXT1zdWZmaXg+PjI0OwoJdWludCBjcmM9Y3JjMzIocGF5bG9hZCxuKzQpOwoJcHJpbnRmKCJjcmMoZGF0YSAgICk9JTA4WFxuIixjcmMpOwoJcHJpbnRmKCJjcmMoeCAgICAgICk9JTA4WFxuIix4ZF9jcmMpOwoKCXJldHVybiAwOwp9