1. C语言编写异或函数

1.函数功能
代码实现将一个字符串,按16个字符一组,分为若干组;第一组与第二组异或,结果在与第三组异或,一次类推得出最终异或结果。
2. 代码实现
//xor_test.c 文件名
#include <stdio.h>
#include <memory.h>
#include <string.h>
 
#define MAX_LENGTH 1024
#define XOR_LENGTH 16
 
//将字符转换为整形
int char_to_int(char ch);
 
int main(int argc, char *argv[])
{
//保存需要异或的字符串
char xor_str[MAX_LENGTH] = {'\0'};
int pos = 0;//字符指针当前所指位置
char buffer[XOR_LENGTH + 1] = {'\0'};
char str1[XOR_LENGTH + 1] = {'\0'};
char str2[XOR_LENGTH + 1] = {'\0'};
int num1 = 0;
int num2 = 0;
int result = 0;
int i = 0;
int count = 0;//实际字符计数器
char ch = '\0';
 
printf("input: ");
fgets(xor_str, MAX_LENGTH, stdin);//可以吸收空格,单无法吸收回车、换行
//函数原型: char *fgets(char *buf, int bufsize, FILE *stream);
// scanf("%s", xor_str);
 
//去掉需要异或字符串里的空格
while(xor_str[i] != '\0'){
ch = xor_str[i];
if(ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t'){
i++;
continue;
}else{
memcpy(xor_str + count++, xor_str + i++, 1);
}
}
 
//将字符串末尾多余的空格全部置空
 memset(xor_str + count, '\0', MAX_LENGTH - count);
 
 
//将需要异或的字符个数,用0补齐位16的整数倍
while(count % XOR_LENGTH != 0){
memcpy(xor_str + count++, "0", 1);
// printf("count: %d ", count);
}
 
//将需要异或字符串前16个字符,拷到str1字符数组中,仅此一次并将指针移至16位置
for(pos = 0; pos < XOR_LENGTH; pos++){
memcpy(str1 + pos, xor_str + pos, 1);
printf("%c", *(str1 +pos));
}
putchar('\n');
 
//循环异或,得出最终结果
for(; pos < strlen(xor_str); pos++){
memcpy(str2 + (pos % XOR_LENGTH), xor_str+ pos, 1);
printf("%c", *(str2 + (pos % XOR_LENGTH)));
//pos大于16是为了从src源字符串中,复制16-31位置共16个字符到str2中,不至于还没复制就循环了;从src取第二批16字符到str2时pos=31,取第三批16字符到str2时pos=47,所以pos需要加1
if((pos > XOR_LENGTH) && ((pos+1) % XOR_LENGTH == 0)){
for(i = 0; i < XOR_LENGTH; i++){
num1 = char_to_int(str1[i]);//调用函数,将字符转换为整形
num2 = char_to_int(str2[i]);
result = num1 ^ num2;//异或
// sprintf(str1 + i, "%0x", result);
sprintf(buffer + i, "%0x", result);//将单个异或结果,按十六进制追加拷入buffer,形成两个字符串异或的结果
}
memcpy(str1, buffer, XOR_LENGTH);//将两个字符串异或结果,在拷入str1字符数组
printf("\tresult: %s\n", str1);//输出异或结果
}
}
 
return 0;
}
 
//将字符转换为整形
int char_to_int(char ch)
{
switch(ch){
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case 'a':
return 10;
case 'b':
return 11;
case 'c':
return 12;
case 'd':
return 13;
case 'e':
return 14;
case 'f':
return 15;
default:
return -1;
}
 
return -1;
}
 
3. 运行结果
终端运行:
[centos@localhost study]$ vi xor_test2.c 
[centos@localhost study]$ gcc xor_test2.c -Wall
[centos@localhost study]$ ./a.out 
input: ba1d1b4056c302e66222032011004560044D4912120514999114400104996222543221987655
ba1d1b4056c302e6
6222032011004560 result: d83f186047c34786
044D491212051499 result: dc7f517255c6531f
9114400104996222 result: 4d6b1173515f313d
5432219876550000 result: 195930eb270a313d
[centos@localhost study]$ 
 
注:最后一组不满16字符,自动用0补全。
posted @ 2018-12-10 17:39  止动  阅读(3872)  评论(0编辑  收藏  举报