/*----------------------------------------------------------------------------函数名称:计算票面信息校验码描述:将给出的字符串经过运算生成四位数字校验码参数:input_str原字...
/*----------------------------------------------------------------------------
函数名称: 计算票面信息校验码
描述: 将给出的字符串经过运算生成四位数字校验码
参数:
input_str 原字符串
返回值:
生成的校验码
-----------------------------------------------------------------------------*/
#include
#include
#include
char* calculateBillMac(char* input_str)
{
int input_len=strlen(input_str); //计算输入字符串长度
char* ascii_buff = (char*)malloc(10); //申请存储ASCII码的内存
char* str_buff_8 =(char*)malloc(1000); //申请存储八进制数字串的内存空间
char* str_buff_10 = (char*)malloc(1000);//申请存储十进制数字串的内存空间
char* str_return =(char*)malloc(10); //申请返回值内存空间
int i,len_8,len_10;
long sum8_1=0,sum8_2=0,sum10_1=0,sum10_2=0;//分别存储八进制和十进制不同算法取值的合计
//初始化内存空间
memset(ascii_buff,0,10);
memset(str_buff_8,0,1000);
memset(str_buff_10,0,1000);
memset(str_return,0,10);
for(i=0 ;i < input_len;i++){//对输入字符串的每一个字节进行循环
sprintf(ascii_buff,"%o",(unsigned char)input_str[i]); //将ASCII码值转换成八进制字符串
strcat(str_buff_8,ascii_buff); //所有八进制ASCII串连接
sprintf(ascii_buff,"%d",(unsigned char)input_str[i]); //将ASCII码值转换成十进制字符串
strcat(str_buff_10,ascii_buff); //所有十进制ASCII串连接
}
len_8= strlen(str_buff_8); //八进制字符串总长度
len_10 = strlen(str_buff_10); //十进制字符串总长度
//将八进制字符串的每一个字符转换成数字,并分别按照正序和反序乘以所在的位置序号
//例如:八进制串为 3452170467
// sum8_1 = 3*1 + 4*2 + 5*3 + 2*4 + 1*5 + ....
// sum8_2 = 7*1 + 6*2 + 4*3 + 0*4 + 7*5 + ....
for(i=1;i<=len_8;i++){
sum8_1 += (str_buff_8[i - 1] - '0')*i;
sum8_2 += (str_buff_8[len_8 - i] - '0')*i;
}
//将十进制字符串的每一个字符转换成数字,并分别按照正序和反序乘以所在的位置序号
for(i=1;i<=len_10;i++){
sum10_1 += (str_buff_10[i - 1] - '0')*i;
sum10_2 += (str_buff_10[len_10 - i] - '0')*i;
}
//释放申请的内存空间
free(str_buff_8);
free(str_buff_10);
free(ascii_buff);
sprintf(str_return,"%d%d%d%d",sum8_1%10,sum8_2%10,sum10_1%10,sum10_2%10);
return str_return;
}
谢谢 给个思路也行,主要是对C语言不熟悉
展开