crc.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "rar.hpp"
  2. uint CRCTab[256];
  3. void InitCRC()
  4. {
  5. for (int I=0;I<256;I++)
  6. {
  7. uint C=I;
  8. for (int J=0;J<8;J++)
  9. C=(C & 1) ? (C>>1)^0xEDB88320L : (C>>1);
  10. CRCTab[I]=C;
  11. }
  12. }
  13. uint CRC(uint StartCRC,const void *Addr,size_t Size)
  14. {
  15. if (CRCTab[1]==0)
  16. InitCRC();
  17. byte *Data=(byte *)Addr;
  18. #if defined(LITTLE_ENDIAN) && defined(PRESENT_INT32) && defined(ALLOW_NOT_ALIGNED_INT)
  19. while (Size>0 && ((long)Data & 7))
  20. {
  21. StartCRC=CRCTab[(byte)(StartCRC^Data[0])]^(StartCRC>>8);
  22. Size--;
  23. Data++;
  24. }
  25. while (Size>=8)
  26. {
  27. StartCRC^=*(uint32 *)Data;
  28. StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
  29. StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
  30. StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
  31. StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
  32. StartCRC^=*(uint32 *)(Data+4);
  33. StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
  34. StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
  35. StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
  36. StartCRC=CRCTab[(byte)StartCRC]^(StartCRC>>8);
  37. Data+=8;
  38. Size-=8;
  39. }
  40. #endif
  41. for (size_t I=0;I<Size;I++)
  42. StartCRC=CRCTab[(byte)(StartCRC^Data[I])]^(StartCRC>>8);
  43. return(StartCRC);
  44. }
  45. #ifndef SFX_MODULE
  46. ushort OldCRC(ushort StartCRC,const void *Addr,size_t Size)
  47. {
  48. byte *Data=(byte *)Addr;
  49. for (size_t I=0;I<Size;I++)
  50. {
  51. StartCRC=(StartCRC+Data[I])&0xffff;
  52. StartCRC=((StartCRC<<1)|(StartCRC>>15))&0xffff;
  53. }
  54. return(StartCRC);
  55. }
  56. #endif