A simple CRC library used to verify configuration data
Fork of CRC by
crc.cpp@0:28e16d33040f, 2013-05-14 (annotated)
- Committer:
- sam_grove
- Date:
- Tue May 14 21:54:06 2013 +0000
- Revision:
- 0:28e16d33040f
- Child:
- 1:ec8513f94d23
Breaking code up into reusable blocks
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sam_grove | 0:28e16d33040f | 1 | |
sam_grove | 0:28e16d33040f | 2 | #define CRC32_POLYNOMIAL 0xEDB88320L |
sam_grove | 0:28e16d33040f | 3 | |
sam_grove | 0:28e16d33040f | 4 | void CRC32Value(unsigned long &CRC, unsigned char c) |
sam_grove | 0:28e16d33040f | 5 | { |
sam_grove | 0:28e16d33040f | 6 | ///////////////////////////////////////////////////////////////////////////////////// |
sam_grove | 0:28e16d33040f | 7 | //CRC must be initialized as zero |
sam_grove | 0:28e16d33040f | 8 | //c is a character from the sequence that is used to form the CRC |
sam_grove | 0:28e16d33040f | 9 | //this code is a modification of the code from the Novatel OEM615 specification |
sam_grove | 0:28e16d33040f | 10 | ///////////////////////////////////////////////////////////////////////////////////// |
sam_grove | 0:28e16d33040f | 11 | unsigned long ulTemp1 = ( CRC >> 8 ) & 0x00FFFFFFL; |
sam_grove | 0:28e16d33040f | 12 | unsigned long ulCRC = ((int) CRC ^ c ) & 0xff ; |
sam_grove | 0:28e16d33040f | 13 | for (int j = 8 ; j > 0; j-- ) |
sam_grove | 0:28e16d33040f | 14 | { |
sam_grove | 0:28e16d33040f | 15 | if ( ulCRC & 1 ) |
sam_grove | 0:28e16d33040f | 16 | ulCRC = ( ulCRC >> 1 ) ^ CRC32_POLYNOMIAL; |
sam_grove | 0:28e16d33040f | 17 | else |
sam_grove | 0:28e16d33040f | 18 | ulCRC >>= 1; |
sam_grove | 0:28e16d33040f | 19 | } |
sam_grove | 0:28e16d33040f | 20 | CRC = ulTemp1 ^ ulCRC; |
sam_grove | 0:28e16d33040f | 21 | } |
sam_grove | 0:28e16d33040f | 22 | |
sam_grove | 0:28e16d33040f | 23 | /* -------------------------------------------------------------------------- |
sam_grove | 0:28e16d33040f | 24 | Calculates the CRC-32 of a block of data all at once |
sam_grove | 0:28e16d33040f | 25 | //the CRC is from the complete message (header plus data) |
sam_grove | 0:28e16d33040f | 26 | //but excluding (of course) the CRC at the end |
sam_grove | 0:28e16d33040f | 27 | -------------------------------------------------------------------------- */ |
sam_grove | 0:28e16d33040f | 28 | unsigned long CalculateBlockCRC32( |
sam_grove | 0:28e16d33040f | 29 | unsigned long ulCount, /* Number of bytes in the data block */ |
sam_grove | 0:28e16d33040f | 30 | unsigned char *ucBuffer ) /* Data block */ |
sam_grove | 0:28e16d33040f | 31 | { |
sam_grove | 0:28e16d33040f | 32 | ////////////////////////////////////////////////////////////////////// |
sam_grove | 0:28e16d33040f | 33 | //the below code tests the CRC32Value procedure used in a markov form |
sam_grove | 0:28e16d33040f | 34 | ////////////////////////////////////////////////////////////////////// |
sam_grove | 0:28e16d33040f | 35 | unsigned long CRC = 0; |
sam_grove | 0:28e16d33040f | 36 | for (int i = 0; i<ulCount; i++) CRC32Value( CRC, *ucBuffer++ ); |
sam_grove | 0:28e16d33040f | 37 | return CRC; |
sam_grove | 0:28e16d33040f | 38 | } |
sam_grove | 0:28e16d33040f | 39 | |
sam_grove | 0:28e16d33040f | 40 | /* |
sam_grove | 0:28e16d33040f | 41 | unsigned long CalculateBlockCRC32( |
sam_grove | 0:28e16d33040f | 42 | unsigned long ulCount, |
sam_grove | 0:28e16d33040f | 43 | unsigned char *ucBuffer ) |
sam_grove | 0:28e16d33040f | 44 | { |
sam_grove | 0:28e16d33040f | 45 | //////////////////////////////////////////// |
sam_grove | 0:28e16d33040f | 46 | //original code from the OEM615 manual |
sam_grove | 0:28e16d33040f | 47 | //////////////////////////////////////////// |
sam_grove | 0:28e16d33040f | 48 | unsigned long ulTemp1; |
sam_grove | 0:28e16d33040f | 49 | unsigned long ulTemp2; |
sam_grove | 0:28e16d33040f | 50 | unsigned long ulCRC = 0; |
sam_grove | 0:28e16d33040f | 51 | while ( ulCount-- != 0 ) |
sam_grove | 0:28e16d33040f | 52 | { |
sam_grove | 0:28e16d33040f | 53 | ulTemp1 = ( ulCRC >> 8 ) & 0x00FFFFFFL; |
sam_grove | 0:28e16d33040f | 54 | ulTemp2 = CRC32Value( ((int) ulCRC ^ *ucBuffer++ ) & 0xff ); |
sam_grove | 0:28e16d33040f | 55 | ulCRC = ulTemp1 ^ ulTemp2; |
sam_grove | 0:28e16d33040f | 56 | } |
sam_grove | 0:28e16d33040f | 57 | return( ulCRC ); |
sam_grove | 0:28e16d33040f | 58 | } |
sam_grove | 0:28e16d33040f | 59 | */ |