标签:
现在字符序列 char buf[] = “hello everyone”;
按行读的话,肯定可以读出数据,如果按列来读话,则会出再乱码的现像。正是这种现
像可作为一种加密手段,称为序列加密。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 char *encode(char *str, int column);//加密函数 5 char **get2DMem(int row, int column);//获得二维空间 6 char *decode(char* str, int column);//解密函数 7 int main(void) 8 { 9 char *str="hello world!!"; 10 int column=5; 11 char *secret=encode(str,column); 12 printf("encode=%s\n",secret); 13 str=decode(secret,column); 14 printf("decode=%s\n",str); 15 return 0; 16 } 17 //加密函数 18 char *encode(char *str, int column) 19 { 20 int len=strlen(str);//原始长度 21 int secretLen=0;//由于是二维序列加密,是吧一个字符串按行存储到一个二维空间中, 22 if(len%column!=0)//后按列读取就是密文,如果最后一行字符串填不满,则自己拿什么字符补齐 23 secretLen=len+(column-len%column);//计算经过处理后的字符串长度 24 else 25 secretLen=len; 26 char *temp=(char *)calloc(secretLen+1, sizeof(char)); 27 strcpy(temp,str); 28 int i=0; 29 for(i=len;i<secretLen;i++)//将原本字符串长度和新长度之间的本程序用*填充 30 { 31 temp[i]=‘*‘; 32 33 } 34 temp[i]=‘\0‘; 35 //到此处已经得到补全长度的字符串,为temp, 36 //接下来处理这个可以填充到二维空间的字符串,填入二维空间 37 //申请并返回二维空间 38 char *ttemp=temp;//用ttemp记录下temp的开头 39 int row=secretLen/column;//计算得到二维空间的行数 40 char **secret=get2DMem(row, column); 41 int j=0; 42 for(i=0;i<row;i++) //将补全后的字符串按行存储到二维空间中 43 for(j=0;j<column;j++) 44 { 45 secret[i][j]=*(temp++); 46 } 47 //到此处已经将字符串按照行序存储到二维空间中了 48 //下面将二维空间中的内容按照列序读入到目标字符串中 49 char *result=(char *)calloc(secretLen+1, sizeof(char)); 50 char *tresult=result;//用tresult记录结果字符串的开头 51 for(i=0;i<column;i++){ 52 for(j=0;j<row;j++) 53 { 54 *result=secret[j][i]; 55 result++; 56 } 57 } 58 *result=0; 59 //加密完成 60 return tresult; 61 } 62 //解密程序 63 char *decode(char* str, int column) 64 { 65 int secretLen=strlen(str); 66 int row=secretLen/column; 67 char **secret=get2DMem(row,column);//申请同样行列数的二维空间 68 int i=0,j=0; 69 for(i=0;i<column;i++)//将字符串按列存储顺序存储到二维空间中 70 for(j=0;j<row;j++) 71 { 72 secret[j][i]=*str++; 73 } 74 char *tresult=(char *)calloc(secretLen+1,sizeof(char)); 75 char *result=tresult; 76 for(i=0;i<row;i++)//将二维空间中的字符按行读取出来就是 77 for(j=0;j<column;j++) 78 { 79 //printf("%c",secret[i][j]); 80 *tresult++=secret[i][j]; 81 } 82 *tresult=0; 83 while(*(--tresult)==‘*‘) 84 ; 85 tresult++; 86 *tresult=0; 87 // printf("decode=%s\n",result); 88 return result; 89 } 90 //申请二维空间函数 91 char **get2DMem(int row, int column) 92 { 93 char **p=(char **)calloc(row,sizeof(char *)); 94 int i=0; 95 for(i=0;i<row;i++) 96 { 97 p[i]=(char *)calloc(column, sizeof(char)); 98 } 99 return p; 100 }
切记用字符指针访问字符串的时候,一定是*p,而不能犯迷糊搞成p之类的,这样访问必然出问题
标签:
原文地址:http://www.cnblogs.com/luojialin/p/4782313.html