免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
C語言對通訊數(shù)據(jù)包生成校驗碼的例子
在寫Socket通訊程序的時候,為了校驗傳送的數(shù)據(jù)包的完整性,我一般會使用給數(shù)據(jù)包附加校驗碼

的方法,具體做法就是: 對要傳輸?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
}

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
06 字符串 char* 字符串
strcat函數(shù)C實現(xiàn)
可以通過函數(shù)strncat strcat實現(xiàn)從字符加入到字符串中
字符串前補0
求兩字符串的公共子串
在VS2010開發(fā)環(huán)境中CString 和char轉(zhuǎn)換
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服