crc.c 604 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <flate.h>
  4. ulong*
  5. mkcrctab(ulong poly)
  6. {
  7. ulong *crctab;
  8. ulong crc;
  9. int i, j;
  10. crctab = malloc(256 * sizeof(ulong));
  11. if(crctab == nil)
  12. return nil;
  13. for(i = 0; i < 256; i++){
  14. crc = i;
  15. for(j = 0; j < 8; j++){
  16. if(crc & 1)
  17. crc = (crc >> 1) ^ poly;
  18. else
  19. crc >>= 1;
  20. }
  21. crctab[i] = crc;
  22. }
  23. return crctab;
  24. }
  25. ulong
  26. blockcrc(ulong *crctab, ulong crc, void *vbuf, int n)
  27. {
  28. uchar *buf, *ebuf;
  29. crc ^= 0xffffffff;
  30. buf = vbuf;
  31. ebuf = buf + n;
  32. while(buf < ebuf)
  33. crc = crctab[(crc & 0xff) ^ *buf++] ^ (crc >> 8);
  34. return crc ^ 0xffffffff;
  35. }