76 lines
1.2 KiB
C++
76 lines
1.2 KiB
C++
/*++
|
|
|
|
Copyright (c) 1998-1999, Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
|
|
Crc32.cpp
|
|
|
|
Abstract:
|
|
|
|
--*/
|
|
|
|
#include "Crc32.h"
|
|
|
|
|
|
CCrc32::CCrc32()
|
|
{
|
|
uClassID = CCRC32_CLASSID;
|
|
|
|
InitialiseCRCTable();
|
|
}
|
|
|
|
|
|
CCrc32::~CCrc32()
|
|
{
|
|
}
|
|
|
|
|
|
VOID CCrc32::InitialiseCRCTable()
|
|
{
|
|
INT nIndex;
|
|
INT nBitIndex;
|
|
ULONG uTableValue;
|
|
|
|
for ( nIndex = 0; nIndex < 256; nIndex++ )
|
|
{
|
|
uTableValue = nIndex;
|
|
|
|
for ( nBitIndex = 0; nBitIndex < 8; nBitIndex++ )
|
|
{
|
|
if ( ( uTableValue & 1 ) == 1 )
|
|
{
|
|
uTableValue = ( uTableValue >> 1 ) ^ CRC32_POLYNOMIAL;
|
|
} else
|
|
{
|
|
uTableValue = uTableValue >> 1;
|
|
}
|
|
}
|
|
|
|
m_uCRC32Table[ nIndex ] = uTableValue;
|
|
}
|
|
}
|
|
|
|
|
|
ULONG CCrc32::CalculateBlockCRC(LPVOID lpvBlock, INT nBlockLength)
|
|
{
|
|
INT nIndex;
|
|
LPBYTE lpbBlock;
|
|
ULONG uCRCValue;
|
|
|
|
_ASSERT( nBlockLength > 0 );
|
|
|
|
lpbBlock = (LPBYTE)lpvBlock;
|
|
uCRCValue = 0xFFFFFFFFL;
|
|
|
|
for ( nIndex = 0; nIndex < nBlockLength; nIndex++ )
|
|
{
|
|
uCRCValue = ( ( uCRCValue >> 8 ) & 0x00FFFFFFL ) ^ ( m_uCRC32Table[ ( uCRCValue ^ lpbBlock[ nIndex ] ) & 0xFFL ] );
|
|
}
|
|
|
|
uCRCValue = uCRCValue ^ 0xFFFFFFFFL;
|
|
|
|
return uCRCValue;
|
|
}
|