#include #include #define ADLER32_INITIAL 0x00000001ul uint_least32_t adler32(uint_least32_t ck, const void *data, size_t len) { unsigned a, b; size_t sublen; a=ck&0xffff; b=(ck>>16)&0xffff; while(len>0) { sublen=len>5552?5552:len; len-=sublen; while(sublen--) { a+=*(char*)data; data=(char*)data+1; b+=a; } a%=65521; b%=65521; } return ((uint_least32_t)b<<16)|a; } int main(void) { char buf[50]; size_t cnt; uint_least32_t ck; ck=ADLER32_INITIAL; do { cnt=fread(buf, 1, sizeof buf, stdin); if(ferror(stdin)) { perror("fread()"); return 0; } ck=adler32(ck, buf, cnt); } while(!feof(stdin)); printf("adler32 = 0x%08x\n", ck); return 1; }