1 // CksumReg.cpp 2 3 #include "StdAfx.h" 4 5 #include "../../C/CpuArch.h" 6 7 #include "../Common/MyCom.h" 8 9 #include "../7zip/Common/RegisterCodec.h" 10 #include "../7zip/Compress/BZip2Crc.h" 11 12 Z7_CLASS_IMP_COM_1( 13 CCksumHasher 14 , IHasher 15 ) 16 CBZip2Crc _crc; 17 UInt64 _size; 18 public: 19 // Byte _mtDummy[1 << 7]; 20 CCksumHasher() 21 { 22 _crc.Init(0); 23 _size = 0; 24 } 25 }; 26 27 Z7_COM7F_IMF2(void, CCksumHasher::Init()) 28 { 29 _crc.Init(0); 30 _size = 0; 31 } 32 33 Z7_COM7F_IMF2(void, CCksumHasher::Update(const void *data, UInt32 size)) 34 { 35 _size += size; 36 CBZip2Crc crc = _crc; 37 for (UInt32 i = 0; i < size; i++) 38 crc.UpdateByte(((const Byte *)data)[i]); 39 _crc = crc; 40 } 41 42 Z7_COM7F_IMF2(void, CCksumHasher::Final(Byte *digest)) 43 { 44 UInt64 size = _size; 45 CBZip2Crc crc = _crc; 46 while (size) 47 { 48 crc.UpdateByte((Byte)size); 49 size >>= 8; 50 } 51 const UInt32 val = crc.GetDigest(); 52 SetUi32(digest, val) 53 } 54 55 REGISTER_HASHER(CCksumHasher, 0x203, "CKSUM", 4) 56