diff options
Diffstat (limited to 'common/crc32.c')
-rw-r--r-- | common/crc32.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/common/crc32.c b/common/crc32.c new file mode 100644 index 0000000..3f8d128 --- /dev/null +++ b/common/crc32.c @@ -0,0 +1,34 @@ +#include "crc32.h" + +/* Polynomial: 0xEDB88320 */ + +/* python3: + * In [26]: apply = lambda st: ((st>>1) ^ 0xEDB88320) if (st & 1) else (st>>1) + * In [27]: print(',\n'.join([ '0x{:08x}'.format(apply(apply(apply(apply(x))))) for x in range(16) ])) + */ +static uint32_t crc32_table[16] = { + 0x00000000, + 0x1db71064, + 0x3b6e20c8, + 0x26d930ac, + 0x76dc4190, + 0x6b6b51f4, + 0x4db26158, + 0x5005713c, + 0xedb88320, + 0xf00f9344, + 0xd6d6a3e8, + 0xcb61b38c, + 0x9b64c2b0, + 0x86d3d2d4, + 0xa00ae278, + 0xbdbdf21c +}; + +uint32_t crc32_update(uint32_t state, uint8_t c) +{ + state ^= c; + state = (state>>4) ^ crc32_table[state&0xf]; + state = (state>>4) ^ crc32_table[state&0xf]; + return state; +} |