問題描述:
現有軟體系統中資料庫同步是通過傳遞SQL字串實現的,在處理字串是很多地方都用到了strlen和sprintf函數;
目前新增的功能在同步bblog資料時,除了需要傳遞sql字串,還需要傳遞位元據,位元據有些位元組為0,在使用strlen時造成判斷長度出錯,在使用sprintf函數時遇到0則認為是結束符。問題解決:如果更改原有的邏輯,更改地方較多且會影響原有的處理方法。更改後需測試環節較多。所以在傳遞之前將位元據轉換為ascii碼進行傳遞,在資料終點再將ascii轉換為位元據。只需測試新增功能和函數即可,對原有系統幾乎沒有影響。具體實現:在寫入資料的地方將位元據轉換為字串;具體轉換原則為:一個位元組的位元據轉換為4個位元組的字串,每個字串的值為+、-、0-9(ascii)。在資料傳遞終點,沒4個位元組的字串轉換為1個位元組的位元據,還原資料。轉換和還原函數:static int ConverDataToStr(int data_len,char *data,int &str_len,char *&str){/*功能:裝換位元據為ASCII碼輸入:data_len:位元據長度data:位元據緩衝輸出:str_len:轉換後的字串資料長度str:轉換後的字串,調用者需要釋放。*/int i,ptr,temp_ptr;str_len = data_len*4;str = (char *)realloc(str,sizeof(char)*(str_len+1));ptr = 0;temp_ptr = 0;for(i=0;i<data_len;i++){temp_ptr = sprintf(str+ptr,"%4d",data[i]);ptr += temp_ptr;}return 0;}static int ConverStrToData(int str_len,char *str,int &data_len,char *&data){/*功能:裝換位元據為ASCII碼輸出:data_len:轉換後的位元據長度data:轉換後的位元據緩衝,調用者需要釋放。輸入:str_len:字串資料長度str:字串資料*/
char temp_str[5];int i=0;char temp_data;int temp_data_len;data_len = str_len/4;data = (char *)realloc(data,sizeof(char)*data_len);temp_data_len = 0;while (i<str_len){memset(temp_str,0,5);memcpy(temp_str,str+i,4);temp_data = atoi(temp_str);memcpy(data+temp_data_len,&temp_data,sizeof(temp_data));temp_data_len++;i+=4;}if (temp_data_len != data_len){data_len = temp_data_len;printf("data len error,data_len:%d,str_data_len:%d",data_len,temp_data_len);}return 0;}demo:#include <stdio.h>#include <stdlib.h>#include <string.h>static int ConverDataToStr(int data_len,char *data,int &str_len,char *&str);static int ConverStrToData(int str_len,char *str,int &data_len,char *&data);int main(int argc, char* argv[]){char data[10];for (int i=0;i<10;i++){data[i] = i*100;if (i==8){data[i] = 255;}} char *str;int ret,str_len;str = NULL;str_len = 0;str = (char *)malloc(1);ret = ConverDataToStr(10,(char *)data,str_len,str);printf("conver data to string ret = %d\n",ret);char *ret_data;int data_len;data_len = 0;ret_data = NULL;ret = ConverStrToData(str_len,str,data_len,ret_data);printf("conver string to data ret = %d\n",ret);for (i=0;i<data_len;i++){if((i!=0) && (i%20 == 0)) printf("\n");printf("data %d = %d ",i+1,data[i]);}free(str);str = NULL;free(ret_data);ret_data = NULL;return 0;}