checksum 算法

 一组数据 test[11]={0x55,0x36,0xdc,0x3d,0x36, 0x33,0x8f,0x30,0x31,0x33, 0xd0}; 求其和校验:前10个数之和 + 校验字节(test[10]) = 0 ,依次可求得checksum ,代码如下:

#include <stdio.h>
#include <string.h>

//typedef unsigned char  U8
//typedef unsigned short U16

/*
U8 CalChecksum(U8 *dat)
{
	U16 i;
	U8 sum=0,checksum=0;
	for(i=0;i<128;i++){
		sum +=dat[i];	
	}
	sum =~sum;
	checksum = (U8)((sum+1)&0xff);
		printf("checksum:%x   ",checksum);
	return checksum;
}

U8 CalSum(U8 *dat)
{
	U16 i;
	U8 sum=0,checksum=0;
	U16 len = sizeof(dat);
		printf("len:%x  ",len);
	for(i=0;i<len;i++){
		sum +=dat[i];	
	}
	printf("sum:%x   ",sum);
	
}
*/
unsigned char CalChecksum1(unsigned char *dat,unsigned short len)
{
	unsigned short i;
	unsigned char sum=0,checksum=0;
	//unsigned short len = strlen(dat);
		printf("CalChecksum len:%x  \n",sizeof(dat));
	for(i=0;i<len-1;i++){
			printf("dat[%d]=%x\n",i,dat[i]);
		sum +=dat[i];	
	}
		printf("---sum:%x   \n",sum);
	sum =~sum;
	checksum = (unsigned char)((sum+1)&0xff);
		printf("checksum:%x   \n",checksum);
	return checksum;
}

unsigned char CalChecksum2(unsigned char *dat,unsigned short len)
{
	unsigned short i;
	unsigned char sum=0,checksum=0;
	//unsigned short len = strlen(dat);//sizeof(dat);
		printf("CalSum len:%x  \n",sizeof(dat));//4  指针dat本身大小 4字节
		printf("CalSum len:%x  \n",strlen(dat));//10 
		printf("len:%x  \n",len);
	for(i=0;i<len-1;i++){
			printf("dat[%d]=%x\n",i,dat[i]);
		sum +=dat[i];	
	}
	checksum = 0x100 - sum;
	return checksum;  
	printf(">>>sum:%x   \n checksum:%x \n",sum,checksum);
	
}


int main(void)
{
	unsigned char test[11]={0x55,0x36,0xdc,0x3d,0x36, 0x33,0x8f,0x30,0x31,0x33, 0x60};
	unsigned char res[128]={0};
	
		printf("test len:%x  \n",sizeof(test));
	CalChecksum2(test,sizeof(test));
	CalChecksum1(test,sizeof(test));
}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值