数据库双机同步问题

问题描述:

现有软件系统中数据库同步是通过传递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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值