110 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			110 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | #include "crc.h"
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | uint8_t crc_crc8(const uint8_t *data,int num) | ||
|  | { | ||
|  |   uint8_t crc = 0; | ||
|  |   uint16_t j,i; | ||
|  |   for (j = 0; j < num; j++) | ||
|  |   { | ||
|  |     crc ^= *(data+j); | ||
|  |     for ( i = 0; i < 8; i++) | ||
|  |     { | ||
|  |       if ((crc & 0x01) != 0) | ||
|  |       { | ||
|  |         crc >>= 1; | ||
|  |         crc ^= 0x8c; | ||
|  |       } | ||
|  |       else | ||
|  |       { | ||
|  |         crc >>= 1; | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  |   return crc; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | void crc_crc16(const uint8_t *data, int len,uint8_t *lb,uint8_t *hb) | ||
|  | { | ||
|  |   if (len > 0) | ||
|  |   { | ||
|  |     uint16_t crc = 0xFFFF; | ||
|  |     int i = 0; | ||
|  |     for (; i < len; i++) | ||
|  |     { | ||
|  |       crc = (uint16_t)(crc ^ (data[i])); | ||
|  |       for (int j = 0; j < 8; j++) | ||
|  |       { | ||
|  |         crc = (crc & 1) != 0 ? (uint16_t)((crc >> 1) ^ 0xA001) : (uint16_t)(crc >> 1); | ||
|  |       } | ||
|  |     } | ||
|  |     uint8_t hi = (uint8_t)((crc & 0xFF00) >> 8); //高位置
 | ||
|  |     uint8_t lo = (uint8_t)(crc & 0x00FF); //低位置
 | ||
|  |     *lb=lo;*hb=hi; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | uint32_t crc_crc32(const uint8_t *data,int size) | ||
|  | { | ||
|  |   uint32_t temp,crc=0xffffffff; | ||
|  |   int i=0,j=0; | ||
|  |   if((size%4)!=0) | ||
|  |   { | ||
|  |     return 0; | ||
|  |   } | ||
|  |   while(i<size) | ||
|  |   { | ||
|  |     temp=data[i]|(data[i+1]<<8)|(data[i+2]<<16)|(data[i+3]<<24); | ||
|  |     i+=4; | ||
|  |     for(j=0;j<32;j++) | ||
|  |     { | ||
|  |       if((crc^temp)&0x80000000) | ||
|  |         crc=0x04c11db7^(crc<<1); | ||
|  |       else | ||
|  |         crc<<=1; | ||
|  |       temp<<=1; | ||
|  |     } | ||
|  |     crc&=0xffffffff; | ||
|  |   } | ||
|  |   return crc; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | void crc_sumcheck(const uint8_t *data,int size,uint8_t *chka,uint8_t *chkb)  | ||
|  | { | ||
|  |   if(chka==0) return; | ||
|  |   if(chkb==0) return; | ||
|  |   *chka=0; | ||
|  |   *chkb=0; | ||
|  | 	for(int i=0;i<size;i++) | ||
|  | 	{ | ||
|  | 		*chka+=data[i]; | ||
|  | 		*chkb+=*chka; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 |