猿问

算法上可以考虑用二维数组下标来解决问题?

函数功能对传入的数据使用固定的Polybius方格进行三分加密,其算法参见下一页的附录。
函数原型
int Three_Parties(char* data, int data_length);
参数
data 待加密数据,其长度由参数data_length指定。返回时,此数组中应该是加密后的数据。
data_length 数据长度(字节数)。
返回值
0 操作成功
1 data中包含有非字母的字符
说明
Polybius方格采用附录中举例那个。
如果data中含有小写字符,则需要转换为大写处理。
加密后的data全部为大写或者可能包含Polybius方格中的那个符号。

提示
在功能函数中,用一个二维数组来存储Polybius方格。

慕尼黑5688855
浏览 123回答 2
2回答

慕工程0101907

#include <stdlib.h>#include <string.h>#include <stdio.h>int Three_Parties(char* data, int data_length){typedef unsigned char UCHAR;int i, index;char* dict;UCHAR* polybius_index;//检查讯息的合法性for(i = 0; i < data_length; i++){if(data[i] >= 'a' && data[i] <= 'z'){//小写转化为大写data[i] &= 0xDF; //小写字母第5位置为0即变为大写//data[i] -= 'a' - 'A'; //这种写法也可以,但没有上一种效率高}else if(data[i] < 'A' || data[i] > 'Z'){//包含非字母的字符return 1;}}dict = "LEOCBFQSTNARGHJUWXDVIKMPYZ/";polybius_index = (UCHAR*)malloc(3 * data_length);for(i = 0; i < data_length; i++){index = strchr(dict, data[i]) - dict;polybius_index[i] = index / 9;index %= 9;polybius_index[i + data_length] = index / 3;polybius_index[i + 2 * data_length] = index % 3;}for(i = 0; i < 3 * data_length; i += 3){index = polybius_index[i]*9 + polybius_index[i+1]*3 + polybius_index[i+2];data[i/3] = dict[index];}free(polybius_index);return 0;}int main(int argc, char* argv[]){char data[] = "helloworld";if(Three_Parties(data, strlen(data)) == 0){printf("%s", data);}else{printf("input error");}return 0;}//加密部分还可以改成建索引表,那样效率会更高,但代码稍微复杂些。希望对你能有所帮助。

慕桂英4014372

#include <stdlib.h>#include <string.h>#include <stdio.h>int Three_Parties(char* data, int data_length){typedef unsigned char UCHAR;int i, index;char* dict;UCHAR* polybius_index;//检查讯息的合法性for(i = 0; i < data_length; i++){if(data[i] >= 'a' && data[i] <= 'z'){//小写转化为大写data[i] &= 0xDF; //小写字母第5位置为0即变为大写//data[i] -= 'a' - 'A'; //这种写法也可以,但没有上一种效率高}else if(data[i] < 'A' || data[i] > 'Z'){//包含非字母的字符return 1;}}dict = "LEOCBFQSTNARGHJUWXDVIKMPYZ/";polybius_index = (UCHAR*)malloc(3 * data_length);for(i = 0; i < data_length; i++){index = strchr(dict, data[i]) - dict;polybius_index[i] = index / 9;index %= 9;polybius_index[i + data_length] = index / 3;polybius_index[i + 2 * data_length] = index % 3;}for(i = 0; i < 3 * data_length; i += 3){index = polybius_index[i]*9 + polybius_index[i+1]*3 + polybius_index[i+2];data[i/3] = dict[index];}free(polybius_index);return 0;}int main(int argc, char* argv[]){char data[] = "helloworld";if(Three_Parties(data, strlen(data)) == 0){printf("%s", data);}else{printf("input error");}return 0;}//加密部分还可以改成建索引表,那样效率会更高,但代码稍微复杂些。
随时随地看视频慕课网APP
我要回答