1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/other-licenses/7zstub/src/Common/CRC.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,61 @@ 1.4 +// Common/CRC.cpp 1.5 + 1.6 +#include "StdAfx.h" 1.7 + 1.8 +#include "CRC.h" 1.9 + 1.10 +static const UInt32 kCRCPoly = 0xEDB88320; 1.11 + 1.12 +UInt32 CCRC::Table[256]; 1.13 + 1.14 +void CCRC::InitTable() 1.15 +{ 1.16 + for (UInt32 i = 0; i < 256; i++) 1.17 + { 1.18 + UInt32 r = i; 1.19 + for (int j = 0; j < 8; j++) 1.20 + if (r & 1) 1.21 + r = (r >> 1) ^ kCRCPoly; 1.22 + else 1.23 + r >>= 1; 1.24 + CCRC::Table[i] = r; 1.25 + } 1.26 +} 1.27 + 1.28 +class CCRCTableInit 1.29 +{ 1.30 +public: 1.31 + CCRCTableInit() { CCRC::InitTable(); } 1.32 +} g_CRCTableInit; 1.33 + 1.34 +void CCRC::UpdateByte(Byte b) 1.35 +{ 1.36 + _value = Table[((Byte)(_value)) ^ b] ^ (_value >> 8); 1.37 +} 1.38 + 1.39 +void CCRC::UpdateUInt16(UInt16 v) 1.40 +{ 1.41 + UpdateByte(Byte(v)); 1.42 + UpdateByte(Byte(v >> 8)); 1.43 +} 1.44 + 1.45 +void CCRC::UpdateUInt32(UInt32 v) 1.46 +{ 1.47 + for (int i = 0; i < 4; i++) 1.48 + UpdateByte((Byte)(v >> (8 * i))); 1.49 +} 1.50 + 1.51 +void CCRC::UpdateUInt64(UInt64 v) 1.52 +{ 1.53 + for (int i = 0; i < 8; i++) 1.54 + UpdateByte((Byte)(v >> (8 * i))); 1.55 +} 1.56 + 1.57 +void CCRC::Update(const void *data, size_t size) 1.58 +{ 1.59 + UInt32 v = _value; 1.60 + const Byte *p = (const Byte *)data; 1.61 + for (; size > 0 ; size--, p++) 1.62 + v = Table[((Byte)(v)) ^ *p] ^ (v >> 8); 1.63 + _value = v; 1.64 +}