#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
int GetcheckValue(int sz[],int nCount)//传数组,校验数组下标,实际上校验值下标只使用了nCount-1
{
int ncheckValue=0;
for (int i = 0; i < nCount; ++i)
{
ncheckValue=(sz[i]<<7)+(sz[i]>>21);//异或两次
}
return ncheckValue;//返回校验的值
}
int main()
{
char sz[]="Hello world";
char ch[]="123456";
int n=GetcheckValue((int *)sz,strlen(sz)/4);
for (int i = 0; i < sizeof(sz)-1; ++i)//字符串结尾有0所以长度-1 小于11应为结尾0是不包括在内的 i只执行到10
{
sz[i]=sz[i]+ch[i%strlen(ch)];//用函数strlen长度不计算末尾0 strlen(ch)==sizeof(ch)-1
}
system("pause");
return 0;
}
数组初始化内存值
ncheckValue=909289315
ncheckValue=-1148175621
ascii码相加 十六进制值相加,内存中调试的话因为signed unsigned 看到的值也许会是负数,不过没关系,因为看内存只是为了做解密的时候校验每一步是否一致(正确),如果说在写解密的时候写错了的话,通过记录的调试过程可以快速的查错,整理自己逻辑思维。
i==0
i%strlen(ch)==0
sz[0]==72'H'
ch[0]==49'1'
sz[0]==121'y'==0x79
i==1
i%strlen(ch)==1
sz[1]==101'e'
ch[1]==50'2'
sz[1]==-105?==0x97
i==2
i%strlen(ch)==2
sz[2]==108'l'
ch[2]==51'3'
sz[2]==-97?==0xa0
i==3
i%strlen(ch)==3
sz[3]==108'l'
ch[3]==52'4'
sz[3]==-96?==0xa4
i==4
i%strlen(ch)==4
sz[4]==111'o'
ch[4]==53'5'
sz[4]==-92? ==0xa4
i==5
i%strlen(ch)==5
sz[5]==32' '
ch[5]==54'6'
sz[5]==86'V'==0x56
i==6
i%strlen(ch)==0
sz[6]==119'w'
ch[0]==49'1'
sz[6]==-88 ==0xa8
i==7
i%strlen(ch)==1
sz[7]==111'o'
ch[1]==50'2'
sz[7]==-95? ==0xa1
i==8
i%strlen(ch)==2
sz[8]==114'r'
ch[2]==51'3'
sz[8]==-91? ==0xa5
i==9
i%strlen(ch)==3
sz[9]==108'l'
ch[3]==52'4'
sz[9]==-96? ==0xa0
i==10
i%strlen(ch)==4
sz[10]==100'd'
ch[3]==53'5'
sz[10]==-103? ==0x99
加密后10进制值
加密后16进制值