rlm@1: // LzhCRC.cpp rlm@1: rlm@1: #include "StdAfx.h" rlm@1: rlm@1: #include "LzhCRC.h" rlm@1: rlm@1: namespace NArchive { rlm@1: namespace NLzh { rlm@1: rlm@1: static const UInt16 kCRCPoly = 0xA001; rlm@1: rlm@1: UInt16 CCRC::Table[256]; rlm@1: rlm@1: void CCRC::InitTable() rlm@1: { rlm@1: for (UInt32 i = 0; i < 256; i++) rlm@1: { rlm@1: UInt32 r = i; rlm@1: for (int j = 0; j < 8; j++) rlm@1: if (r & 1) rlm@1: r = (r >> 1) ^ kCRCPoly; rlm@1: else rlm@1: r >>= 1; rlm@1: CCRC::Table[i] = (UInt16)r; rlm@1: } rlm@1: } rlm@1: rlm@1: class CCRCTableInit rlm@1: { rlm@1: public: rlm@1: CCRCTableInit() { CCRC::InitTable(); } rlm@1: } g_CRCTableInit; rlm@1: rlm@1: void CCRC::Update(const void *data, size_t size) rlm@1: { rlm@1: UInt16 v = _value; rlm@1: const Byte *p = (const Byte *)data; rlm@1: for (; size > 0; size--, p++) rlm@1: v = (UInt16)(Table[((Byte)(v)) ^ *p] ^ (v >> 8)); rlm@1: _value = v; rlm@1: } rlm@1: rlm@1: }}