33 #ifndef __INCLUDE_CRC__
34 #define __INCLUDE_CRC__
36 #ifndef __INCLUDE_MIST_CONF_H__
44 namespace crc_generator_polynominal
47 template <
int BIT >
struct crc_default
49 _MIST_CONST(
size_t, gen_poly, 0 );
52 template < >
struct crc_default< 8 >
54 _MIST_CONST(
size_t, gen_poly, 0x07 );
57 template < >
struct crc_default< 16 >
59 _MIST_CONST(
size_t, gen_poly, 0x8005 );
62 template < >
struct crc_default< 32 >
64 _MIST_CONST(
size_t, gen_poly, 0x04c11db7 );
82 static size_t generate(
const unsigned char * pdata,
size_t len,
size_t gen_poly = crc_generator_polynominal::crc_default< BIT >::gen_poly )
89 mask = 1 << ( BIT - 1 );
91 for( n = 0 ; n < len ; n++ )
95 for( m = 0 ; m < 8 ; m++ )
97 if( ( crc & mask ) != 0 )
107 if( ( data & 0x80 ) != 0 )
116 for( n = 0 ; n < ( BIT >> 3 ) ; n++ )
118 for( m = 0 ; m < 8 ; m++ )
120 if( ( crc & mask ) != 0 )
132 return ( crc & ( ( mask << 1 ) - 1 ) );
145 static bool check(
const unsigned char * pdata,
size_t len,
size_t crc_,
size_t gen_poly = crc_generator_polynominal::crc_default< BIT >::gen_poly )
147 return ( generate( pdata, len, gen_poly ) == crc_ );
159 static size_t generate_implant(
unsigned char * pdata,
size_t len,
size_t gen_poly = crc_generator_polynominal::crc_default< BIT >::gen_poly )
166 mask = 1 << ( BIT - 1 );
168 for( n = 0 ; n < len - BIT / 8 ; n++ )
172 for( m = 0 ; m < 8 ; m++ )
174 if( ( crc & mask ) != 0 )
184 if( ( data & 0x80 ) != 0 )
193 for( n = 0 ; n < ( BIT >> 3 ) ; n++ )
195 for( m = 0 ; m < 8 ; m++ )
197 if( ( crc & mask ) != 0 )
210 for( n = 0 ; n < ( BIT >> 3 ) ; n++ )
212 pdata[ len - ( BIT >> 3 ) + n ] = static_cast< unsigned char >( crc >> ( ( ( BIT >> 3 ) - 1 - n ) << 3 ) ) & 0xff;
215 return ( crc & ( ( mask << 1 ) - 1 ) );
228 static bool check_implant(
const unsigned char * pdata,
size_t len,
size_t gen_poly = crc_generator_polynominal::crc_default< BIT >::gen_poly )
230 return ( generate( pdata, len, gen_poly ) == 0 );
239 #endif // __INCLUDE_CRC__