第一段是將高nleft/2位的數(shù)字累加第二段式說 如果nleft=1 sum等于 w的高位第三段 將sum的高十六位移到地十六位 并與原sum的低16位相加然后再把得到的這個數(shù)取反 至于這句話sum+=(sum16); 我也沒太看懂sum已經(jīng)剩下低16位了再右移不久是0了嗎 加0有什么意義呢?這大概是一個校驗碼的生成方法你對照這個方法看代碼應該就很容易理解了我現(xiàn)在看代碼也就是看看代碼再干什么
創(chuàng)新互聯(lián)建站專注于嘉魚企業(yè)網(wǎng)站建設,響應式網(wǎng)站開發(fā),商城系統(tǒng)網(wǎng)站開發(fā)。嘉魚網(wǎng)站建設公司,為嘉魚等地區(qū)提供建站服務。全流程按需網(wǎng)站設計,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務
請把問題的描述提供的更具體一些,否則無法提供更詳細的幫助。
就現(xiàn)有的信息來看,有這幾個點:
1.C語言字符串。就是以單字節(jié)字符為內容,用'\0'表示結尾的字符串表示方式。
2.校驗和。由數(shù)據(jù)計算得到的一個數(shù)值,具有以下兩個特性:
a)相同的數(shù)據(jù)計算出的校驗和結果必定是相同的
b)數(shù)據(jù)有所變動時,計算出的校驗和一般不相同
常用的校驗和有累加和異或方式。比如,[1,2,3,4,5]這一組數(shù)據(jù)的累加較驗和就是1+2+3+4+5=15
3.異或。異或是一種二進制(邏輯)運算,定義如下:
1與1、0與0的異或結果為0
1與0、0與1的異或結果為1
如35和27,其二進制表示為:100011和11011。低位對齊后進行異或,結果為:111000,也就是56
4.在C語言中,異或運算的運算符為:^
也就是說35^27的值就是56。
#includestdio.h
int?Quicksum(char?*str)???????????//用指針做校驗函數(shù)的參數(shù),來接收被校驗的字符串A;
{
int?sum=0,loc=1,i,n;?????????????????//sum代表校驗和,loc代表每個字符在字符串A里的位置;
char?*p;
p=str;??????????????????????????????????????????//將被校驗字符串A的地址賦值給字符指針p,用p表示位置;
n=strlen(p);????????????????????????????????????//?用strlen函數(shù)求出A的有效長度;
for(i=0;in;i++)???????????????????????????//注意循環(huán)的次數(shù)。體會in的意思,保證能計算到每個字符
{
if((*p)=='?')?{p++;?loc++;continue;}?????//如果遇到空格,就將位置指針向后移動一個,跳過空格
//注意loc也要增加一,為了正確記錄每個字符的位置
sum+=((*p-'A')+1)*loc;????????//如果此處不是空格,就根據(jù)校驗計算該位置所代表的和,進行累加
loc++;??????????????????????????????????//將位置指針移動到下一個字符,同時loc也跟著變化
p++;
}
return?sum;?????????????????????//返回校驗和
}
void?main()
{
int?jiaoyanhe;
char?*string;
printf("Please?input?(A-Z)?:?");
gets(string);??????????????????????//使用gets函數(shù)輸入字符串;
jiaoyanhe=Quicksum(string);?????//調用Quicksum函數(shù)進行校驗和的計算。
printf("jiao?yan?he?:??");
printf("%d\n",jiaoyanhe);
}
上機運行的時候,把注釋全刪了吧,要不然可能運行出錯,多體會一下吧,這只是其中的一種方法而已,多上機運行代碼,理解下里面的邏輯,好運。
用位運算按位與得出校驗數(shù),參考代碼如下:
#includestdio.h
int main()
{
char str[101];
int i,sum;
gets(str);
i=sum=0;
while(str[i]!=0)
sum+=str[i++];
printf("%d",sum(0x0FF));
return 0;
}
Ctrl+F9 - Alt+F5 反正不管哪個版本 先組建再編譯 系統(tǒng)就自動檢查是否有錯誤 最后在運行就OK了。
【temp=temp+*chk8;】
temp加上 chk8地址上的值 再復制給temp
【if(temp*chk8)】
如果temp小于chk8地址上的值
temp自增
chk8位置自增
*chk8 你可以當它是個變量
chk8 的值是一個地址
chk8++ 指針往后移,后移的大小和指針指向類型大小一樣.