当前位置: 首页 > 工具软件 > gt-checksum > 使用案例 >

checksum校验和示例和工具

叶桐
2023-12-01

CRC校验工具
http://www.metools.info/code/c15.html

http://www.ip33.com/crc.html

校验算法:
CRC-16
CRC-16/X25 两者貌似不一样

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef	unsigned short	uint16_t;
typedef	unsigned int	uint32_t;
typedef	unsigned char	uint8_t;

static short crctab16[] = 
{
    (short)0x0000, (short)0x1189, (short)0x2312, (short)0x329b, (short)0x4624, (short)0x57ad, (short)0x6536, (short)0x74bf,
    (short)0x8c48, (short)0x9dc1, (short)0xaf5a, (short)0xbed3, (short)0xca6c, (short)0xdbe5, (short)0xe97e, (short)0xf8f7,
    (short)0x1081, (short)0x0108, (short)0x3393, (short)0x221a, (short)0x56a5, (short)0x472c, (short)0x75b7, (short)0x643e,
    (short)0x9cc9, (short)0x8d40, (short)0xbfdb, (short)0xae52, (short)0xdaed, (short)0xcb64, (short)0xf9ff, (short)0xe876,
    (short)0x2102, (short)0x308b, (short)0x0210, (short)0x1399, (short)0x6726, (short)0x76af, (short)0x4434, (short)0x55bd,
    (short)0xad4a, (short)0xbcc3, (short)0x8e58, (short)0x9fd1, (short)0xeb6e, (short)0xfae7, (short)0xc87c, (short)0xd9f5,
    (short)0x3183, (short)0x200a, (short)0x1291, (short)0x0318, (short)0x77a7, (short)0x662e, (short)0x54b5, (short)0x453c,
    (short)0xbdcb, (short)0xac42, (short)0x9ed9, (short)0x8f50, (short)0xfbef, (short)0xea66, (short)0xd8fd, (short)0xc974,
    (short)0x4204, (short)0x538d, (short)0x6116, (short)0x709f, (short)0x0420, (short)0x15a9, (short)0x2732, (short)0x36bb,
    (short)0xce4c, (short)0xdfc5, (short)0xed5e, (short)0xfcd7, (short)0x8868, (short)0x99e1, (short)0xab7a, (short)0xbaf3,
    (short)0x5285, (short)0x430c, (short)0x7197, (short)0x601e, (short)0x14a1, (short)0x0528, (short)0x37b3, (short)0x263a,
    (short)0xdecd, (short)0xcf44, (short)0xfddf, (short)0xec56, (short)0x98e9, (short)0x8960, (short)0xbbfb, (short)0xaa72,
    (short)0x6306, (short)0x728f, (short)0x4014, (short)0x519d, (short)0x2522, (short)0x34ab, (short)0x0630, (short)0x17b9,
    (short)0xef4e, (short)0xfec7, (short)0xcc5c, (short)0xddd5, (short)0xa96a, (short)0xb8e3, (short)0x8a78, (short)0x9bf1,
    (short)0x7387, (short)0x620e, (short)0x5095, (short)0x411c, (short)0x35a3, (short)0x242a, (short)0x16b1, (short)0x0738,
    (short)0xffcf, (short)0xee46, (short)0xdcdd, (short)0xcd54, (short)0xb9eb, (short)0xa862, (short)0x9af9, (short)0x8b70,
    (short)0x8408, (short)0x9581, (short)0xa71a, (short)0xb693, (short)0xc22c, (short)0xd3a5, (short)0xe13e, (short)0xf0b7,
    (short)0x0840, (short)0x19c9, (short)0x2b52, (short)0x3adb, (short)0x4e64, (short)0x5fed, (short)0x6d76, (short)0x7cff,
    (short)0x9489, (short)0x8500, (short)0xb79b, (short)0xa612, (short)0xd2ad, (short)0xc324, (short)0xf1bf, (short)0xe036,
    (short)0x18c1, (short)0x0948, (short)0x3bd3, (short)0x2a5a, (short)0x5ee5, (short)0x4f6c, (short)0x7df7, (short)0x6c7e,
    (short)0xa50a, (short)0xb483, (short)0x8618, (short)0x9791, (short)0xe32e, (short)0xf2a7, (short)0xc03c, (short)0xd1b5,
    (short)0x2942, (short)0x38cb, (short)0x0a50, (short)0x1bd9, (short)0x6f66, (short)0x7eef, (short)0x4c74, (short)0x5dfd,
    (short)0xb58b, (short)0xa402, (short)0x9699, (short)0x8710, (short)0xf3af, (short)0xe226, (short)0xd0bd, (short)0xc134,
    (short)0x39c3, (short)0x284a, (short)0x1ad1, (short)0x0b58, (short)0x7fe7, (short)0x6e6e, (short)0x5cf5, (short)0x4d7c,
    (short)0xc60c, (short)0xd785, (short)0xe51e, (short)0xf497, (short)0x8028, (short)0x91a1, (short)0xa33a, (short)0xb2b3,
    (short)0x4a44, (short)0x5bcd, (short)0x6956, (short)0x78df, (short)0x0c60, (short)0x1de9, (short)0x2f72, (short)0x3efb,
    (short)0xd68d, (short)0xc704, (short)0xf59f, (short)0xe416, (short)0x90a9, (short)0x8120, (short)0xb3bb, (short)0xa232,
    (short)0x5ac5, (short)0x4b4c, (short)0x79d7, (short)0x685e, (short)0x1ce1, (short)0x0d68, (short)0x3ff3, (short)0x2e7a,
    (short)0xe70e, (short)0xf687, (short)0xc41c, (short)0xd595, (short)0xa12a, (short)0xb0a3, (short)0x8238, (short)0x93b1,
    (short)0x6b46, (short)0x7acf, (short)0x4854, (short)0x59dd, (short)0x2d62, (short)0x3ceb, (short)0x0e70, (short)0x1ff9,
    (short)0xf78f, (short)0xe606, (short)0xd49d, (short)0xc514, (short)0xb1ab, (short)0xa022, (short)0x92b9, (short)0x8330,
    (short)0x7bc7, (short)0x6a4e, (short)0x58d5, (short)0x495c, (short)0x3de3, (short)0x2c6a, (short)0x1ef1, (short)0x0f78
};
static short getCrc16(char *pData, int nLength)
{
	short fcs = (short) 0xffff;   // 初始化
    int i;
    for(i=0;i<nLength;i++)
    {
        fcs = (short) (((fcs & 0xFFFF) >> 8) ^ crctab16[(fcs ^ pData[i]) & 0xff]);
    }
    return (short) ~fcs;
}

unsigned short checksum_16(unsigned short *addr,int len)
{
	unsigned short chksum;
	unsigned int sum = 0;
 
	while(len > 1)
	{
		sum += *addr++;
		len -= 2;
	}
	
	if(len == 1)
		sum += *(unsigned char*)addr;
		
	sum = (sum>>16) + (sum & 0xffff);
	sum += (sum>>16);
	chksum = ~sum;
	return (chksum);

}
	
uint16_t checksum(void *addr, int count)
{
	/* Compute Internet Checksum for "count" bytes
	 *         beginning at location "addr".
	 */
	uint32_t sum = 0;
	uint16_t *source = (uint16_t *) addr;

	while (count > 1)  {
		/*  This is the inner loop */
		sum += *source++;
		count -= 2;
	}

	/*  Add left-over byte, if any */
	if (count > 0) {
		/* Make sure that the left-over byte is added correctly both
		 * with little and big endian hosts */
		uint16_t tmp = 0;
		*(uint8_t *) (&tmp) = * (uint8_t *) source;
		sum += tmp;
	}
	/*  Fold 32-bit sum to 16 bits */
	while (sum >> 16)
		sum = (sum & 0xffff) + (sum >> 16);

	return ~sum;
}
int main()
{
	char str[]= "1234";
   /*  Write C code in this online editor and run it. */
   printf("Hello, World! %x \n",checksum((void *)str,4));
   printf("Hello, World! %x \n",checksum_16((unsigned short *)str,4));
   printf("Hello, World! %x \n",getCrc16((char  *)str,4));
   return 0;
}
 类似资料: