other-licenses/7zstub/src/Common/CRC.cpp

changeset 0
6474c204b198
     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 +}

mercurial