/* (C) 2003 XDA Developers itsme@xs4all.nl * * $Header$ */ #include "crc32.h" #include #include "vectorutils.h" static class CRCCalc { public: CRCCalc() { initcrc(0xEDB88320L); } DWORD crc32(DWORD prev, BYTE c) const { return (prev>>8) ^ crc32tab[(int)((prev&0xff)^c)]; } private: DWORD crc32tab[256]; /* crcBase = 0xEDB88320L */ DWORD calccrc32tab(BYTE c, DWORD crcBase) { DWORD val = c; int i; for (i=0 ; i<8 ; i++) { if (val&1) val = (val>>1)^crcBase; else val = (val>>1); } return val; } void initcrc(DWORD crcBase) { DWORD val; int i; for (i=0 ; i<256 ; i++) { val = calccrc32tab(i, crcBase); crc32tab[i]=val; } } } g_crccalc; DWORD add_to_crc32(DWORD prev, BYTE c) { return g_crccalc.crc32(prev, c); } DWORD calccrc32(const ByteVector& buf) { DWORD crc= 0; for (ByteVector::const_iterator i= buf.begin() ; i!=buf.end() ; ++i) crc= add_to_crc32(crc, *i); return crc; } DWORD calccrc32(const BYTE*buf, DWORD len) { DWORD crc= 0; while (len--) crc= add_to_crc32(crc, *buf++); return crc; }