unsigned char cksum1(unsigned char *p,int len) //该函数传入一个字符数组的地址和数组长度
{
unsigned char *q,i;
unsigned char checksum=0; //数组和变量先初始化为0
q=p; //将数组地址给q。后面用指针q访问数组
for(i=0;i
checksum+=q[i]; //将数组的字符的ascii码求和
}
return checksum; //返回求和值。 因unsigned char类型为0~255范围。所有当checksum超过255时回归零重新计数。
}
假设一个数组a[3]={a,c,d};
那调用这个函数形式为
sum = cksum1(a,3);
最终返回的结果就是
a[3]数组里所有字符的ascii码之和即 ‘a’+‘b' + ’c' = 97+98+99 = 294
因294有超过255.所以该函数实际返回的值为294 %256 = 38
这是从一些预测游戏中考下来的代码么?根本不标准也不安全啊……我跟你解释一下程序的意思:计算机一共定义256个字符(字母数字加各种标点符号),编号分别为0-255,基本上是循环的(意思是,编号等于256的字符就相当于编号为0的字符,257就相当于编号为1)。
这个程序的意思就是:取出一定数量(len个)的字符,把他们的编号相加得到一个和,然后结果得到的是:编号为那个和的字符……
对参数p指向的长度为len的字符串求校验和,校验和算法就是简单求所有字符的和,不考虑溢出,最后返回校验和。但代码里有个问题好像,参数的长度是int类型,函数里用来控制循环的变量i定义成了unsigned char,这样当len大于255时可能会有问题,当然也可能不会,取决于设计校验方式的出发点。
定义无符号字母函数CKSUN1(获取无符号字符P的指针,数字型len)
{
定义无符号字符指针p,字符i;
定义无符号字符checksum并初始化为0;
把p的值赋值给q;
只要(i第一次是0,i小于len;i自增1)
{把checksum的值加q数组第i个的值赋值给checksum;
}(到这边再回到上两行的只要语段,直到i不小于len才执行下面的代码)
回到checksum,就是说这个函数最后的结果就是checksum,也就是这个东西有用;
}
unsigned char在计算机中使用补码存储,貌似是把P的值的和放到checksum,返回一个补码!不知道对不对,个人感觉