在项目开发过程中,经常会使用到checksum检验和,但是在不同的协议对接过程中发现checksum算法还是有差异的。本文的目的是对常用的checksum算法进行总结,并不断完善和补充,以备后期在项目中直接使用。
目前,使用到的checksum算法如下:
/*checksum.c*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "checksum.h"
/*test*/
void custom_checksum_test(void)
{
custom_checksum_1();
}
/*方式-1
注:测试网址:http://www.metools.info/code/c128.html
*/
void custom_checksum_1(void)
{
int i = 0;
int len = 0;
unsigned short tempChecksum = 0;
unsigned char checksum = 0;
unsigned char data[8] = { 0 };
/* 33 35 37 45 */
data[0] = 0x33;
data[1] = 0x35;
data[2] = 0x37;
data[3] = 0x45;
len = strlen(data);
for (i = 0; i < len; i++)
{
tempChecksum += data[i];
printf("tempChecksum: %d(0x%X)\n", tempChecksum, tempChecksum);
}
printf("\n");
if (tempChecksum > 0xFF)
{
//取补码
tempChecksum = ~tempChecksum;
tempChecksum += 1;
}
checksum = (unsigned char)tempChecksum;
printf("checksum: %d(0x%X)\n", checksum, checksum);
}
/* 方式-2
注:测试网址之前没记录,暂时找不到了,待补充
*/
void custom_checksum_2(void)
{
int i = 0;
int len = 0;
unsigned short tempChecksum = 0;
unsigned char checksum = 0;
unsigned char data[8] = { 0 };
/* 4A 55 93 E5 */
data[0] = 0x4A;
data[1] = 0x55;
data[2] = 0x93;
data[3] = 0xE5;
len = strlen(data);
for (i = 0; i < len; i++)
{
tempChecksum += data[i];
printf("tempChecksum: %d(0x%X)\n", tempChecksum, tempChecksum);
checksum = (unsigned char)tempChecksum;
if (tempChecksum > 0xFF)
{
checksum += 1;
}
printf("checksum: %d(0x%X)\n", checksum, checksum);
tempChecksum = checksum;
}
printf("\n");
printf("checksum: %d(0x%X)\n", checksum, checksum);
checksum = ~checksum;
printf("checksum: %d(0x%X)\n", checksum, checksum);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)