-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathCrc32.cpp
More file actions
72 lines (60 loc) · 1.84 KB
/
Crc32.cpp
File metadata and controls
72 lines (60 loc) · 1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
Copyright [2010] [Richard Bross]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/////////////////////////////////////////////////////////////////////////////
// CRC32.cpp - implementation of CRC object
// Richard A. Bross, 1/23/97
#if defined(_WIN32)
#include <stdafx.h>
#endif
#include "Crc32.h"
// Constructor
CRC32::CRC32()
{ // Load the CRC32 table
unsigned int ix; // Index
unsigned char bx;
int carry;
// Build the table
for (ix = 0; ix < 256; ix++)
{
lCrcTable[ix] = ix;
for (bx = 0; bx < 8; bx++)
{
carry = lCrcTable[ix] & 1;
lCrcTable[ix] >>= 1;
if (carry)
lCrcTable[ix] ^= 0xEDB88320;
};
};
};
// Destructor
CRC32::~CRC32()
{
};
// Calculate a CRC. For first call when calculating for a stream,
// lInit should be = 0xFFFFFFFF.
unsigned long CRC32::CalcCRC(unsigned long lInit,
unsigned char *lpBuffer, int iLength)
{
int ix; /* Index */
unsigned char bx;
/* Now calculate the CRC */
for (ix = 0; ix < iLength; ix++)
{
bx = ((unsigned char *)(&lInit))[0]; /* Set up index into table */
bx ^= lpBuffer[ix];
lInit >>= 8; /* Shift a complete byte */
((unsigned char*)(&lInit))[3] = 0; /* Make sure MSB = 0 */
lInit ^= lCrcTable[bx]; /* XOR with table entry */
};
return(lInit);
};