问题描述:
现有软件系统中数据库同步是通过传递SQL字符串实现的,在处理字符串是很多地方都用到了strlen和sprintf函数;
目前新增的功能在同步bblog数据时,除了需要传递sql字符串,还需要传递二进制数据,二进制数据有些字节为0,在使用strlen时造成判断长度出错,在使用sprintf函数时遇到0则认为是结束符。
目前新增的功能在同步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;
}