的方法,具體做法就是: 對要傳輸?shù)臄?shù)據(jù)從第一個字符到最后一個字符進行異或運算,最后回得到一個異或
結(jié)果字符,把這個字符轉(zhuǎn)換為2進制字符串!附加在數(shù)據(jù)包后面,收取數(shù)據(jù)的一方,收到數(shù)據(jù)后,先根據(jù)預(yù)先定義
的格式拆分數(shù)據(jù)包,對收到的數(shù)據(jù)進行異或運算, 然后把結(jié)果和發(fā)送方的校驗碼比較,如果一致,說明數(shù)據(jù)傳輸
沒有問題。
附上一段銀行接口實際應(yīng)用中的例子:
//定義報文結(jié)構(gòu)
typedef struct tradePackage
{
char p_trade_code[4];
char p_mobile_no[16];
char p_agent_account[26];
char p_our_account[26];
char p_trade_fee[16];
char p_trade_date[9];
char p_trade_time[7];
char p_bank_id[3];
char p_trade_node[11];
char p_operator_no[5];
char p_bank_flow_no[13];
char p_result_code[4];
char p_our_flow_no[13];
char p_check_code[9];
}PACKAGE;
/*
功能描述:生成發(fā)送報文的校驗碼(顯示為2進制的字符方式)
返回參數(shù):checkcode為對input_buf串的每個字符做異或生成的校驗碼
*/
void make_XOR_checkcode(char * input_buf,char * checkcode)
{
int m=strlen(input_buf);
int i,n;
//保存異或的結(jié)果字符
char ret;
char s[m];
char b[8];
int x=0x80;
strcpy(s,input_buf);
//給準(zhǔn)備返回的報文字符逐個做異或
for(i=0;i<m-1;i++)
{
if(i==0)
{
ret=s[i]^s[i+1];
}
else
{
ret=ret^s[i+1];
}
}
/*
用異或的結(jié)果ret和x做位比較,做出ret的2進制校驗碼 start
*/
for(n=0;n<8;n++)
{
if((ret&x)==0)
{
b[n]='0';
}
else
{
b[n]='1';
}
x=x>>1; //右移一位相當(dāng)于除2
}
b[8]='\0';
/*
用異或的結(jié)果ret和x做位比較,做出ret的2進制校驗碼 end
*/
strcpy(checkcode,b); //返回生成的校驗碼
}
/*
功能描述:檢驗發(fā)來的數(shù)據(jù)報文的內(nèi)容是否與校驗碼一致
返回參數(shù):trade_package參數(shù)是由銀行方傳來的報文,用trade_package.p_check_code來
對其他的字符串進行校驗。校驗成功返回1,否則返回0
*/
int packageXOR_parse(struct tradePackage trade_package)
{
//報文格式:交易碼3手機號碼15代理商銀行賬號25商戶銀行賬號25金額15交易日期8交易時間6銀行編碼2交易網(wǎng)點10
//操作員4銀行流水號12結(jié)果代碼3商戶流水號12校驗碼8
char chkcode[8];
char strtmp[256];
char input_str[1024];
char checkcode[8];
memset(input_str, 0x0, sizeof(input_str));
//1:交易碼 3 不空
strcpy(input_str,trade_package.p_trade_code);
//2:手機號碼 15 不空 右補空格
memset(strtmp, 0x0, 15);
sprintf(strtmp,"%-15s",trade_package.p_mobile_no); //顯示字符串時限定15位(不足則補空格),并靠左端對齊
strcat(input_str,strtmp);
//3:代理商銀行賬號 25 不空 右補空格(如現(xiàn)金繳款,全空格)
memset(strtmp, 0x0, 25);
sprintf(strtmp,"%-25s",trade_package.p_agent_account); //顯示字符串時限定25位(不足則右補空格),并靠左端對齊
strcat(input_str,strtmp);
//4:商戶銀行賬號 25 不空
memset(strtmp, 0x0, 25);
sprintf(strtmp,"%-25s",trade_package.p_our_account); //顯示字符串時限定25位(不足則右補空格),并靠左端對齊
strcat(input_str,strtmp);
//5:金額 15 不空 含小數(shù)點和兩位小數(shù),右補空格
//sprintf(trade_package.p_trade_fee,"%0.2f",p_trade_fee);
memset(strtmp, 0x0, 15);
sprintf(strtmp,"%-15s",trade_package.p_trade_fee); //顯示字符串時限定15位(不足則右補空格),并靠左端對齊
strcat(input_str,strtmp);
//6:交易日期 8 不空 YYYYMMDD
strcat(input_str,trade_package.p_trade_date);
//7:交易時間 6 不空 HHMMSS
strcat(input_str,trade_package.p_trade_time);
//8:銀行編碼 2 不空
strcat(input_str,trade_package.p_bank_id);
//9:交易網(wǎng)點 10 不空 根據(jù)銀行方規(guī)定
strcat(input_str,trade_package.p_trade_node);
//10:操作員 4 不空 柜臺:操作員其它為設(shè)備號
strcat(input_str,trade_package.p_operator_no);
//11:銀行流水號 12 不空 左補0做重復(fù)性檢查
sprintf(strtmp,"%12s",trade_package.p_bank_flow_no); //顯示字符串時限定12位(不足則左邊補空格),并靠右端對齊
strcat(input_str,strtmp);
//12:結(jié)果代碼 3 空格
strcat(input_str,trade_package.p_result_code);
//13:商戶流水號 12 空格 左補0
//顯示字符串時限定12位(不足則左邊補0),并靠右端對齊
sprintf(strtmp,"%012s",trade_package.p_our_flow_no);
strcat(input_str,strtmp);
//用發(fā)來的報文生成校驗碼chkcode,然后用chkcode和trade_package.p_check_code進行比較 start
make_XOR_checkcode(input_str,chkcode);
char str[128];
sprintf(str,"%d",strcmp(trade_package.p_check_code,chkcode));
strcat(str," comp");
//如果比較
if(strcmp(trade_package.p_check_code,chkcode)==0)
return 1;
else
return 0;
//用發(fā)來的報文生成校驗碼chkcode,然后用chkcode和trade_package.p_check_code進行比較 end
}