| // CksumReg.cpp |
| |
| #include "StdAfx.h" |
| |
| #include "../../C/CpuArch.h" |
| |
| #include "../Common/MyCom.h" |
| |
| #include "../7zip/Common/RegisterCodec.h" |
| #include "../7zip/Compress/BZip2Crc.h" |
| |
| Z7_CLASS_IMP_COM_1( |
| CCksumHasher |
| , IHasher |
| ) |
| CBZip2Crc _crc; |
| UInt64 _size; |
| public: |
| // Byte _mtDummy[1 << 7]; |
| CCksumHasher() |
| { |
| _crc.Init(0); |
| _size = 0; |
| } |
| }; |
| |
| Z7_COM7F_IMF2(void, CCksumHasher::Init()) |
| { |
| _crc.Init(0); |
| _size = 0; |
| } |
| |
| Z7_COM7F_IMF2(void, CCksumHasher::Update(const void *data, UInt32 size)) |
| { |
| _size += size; |
| CBZip2Crc crc = _crc; |
| for (UInt32 i = 0; i < size; i++) |
| crc.UpdateByte(((const Byte *)data)[i]); |
| _crc = crc; |
| } |
| |
| Z7_COM7F_IMF2(void, CCksumHasher::Final(Byte *digest)) |
| { |
| UInt64 size = _size; |
| CBZip2Crc crc = _crc; |
| while (size) |
| { |
| crc.UpdateByte((Byte)size); |
| size >>= 8; |
| } |
| const UInt32 val = crc.GetDigest(); |
| SetUi32(digest, val) |
| } |
| |
| REGISTER_HASHER(CCksumHasher, 0x203, "CKSUM", 4) |