下面这段程序在delphi里面会有数据丢失的现象var
S: string;
WS: widestring;
begin
s := #1+#189+#60+#50 ;
showmessage(inttostr(Length(S))); WS := s;
s := ws;showmessage(inttostr(Length(S)));
end;现在我要做的是用C写一个函数怎么来模仿这种数据丢失的现象?(公司里Delphi程序是不可以改的,我要用C来实现这个功能就必须要先实现他这个错误的转换方法,不然最终得到的结果匹配不了)
我知道僵哥对这两种语言的基本东西都非常了解,希望你能帮帮我,谢谢。
S: string;
WS: widestring;
begin
s := #1+#189+#60+#50 ;
showmessage(inttostr(Length(S))); WS := s;
s := ws;showmessage(inttostr(Length(S)));
end;现在我要做的是用C写一个函数怎么来模仿这种数据丢失的现象?(公司里Delphi程序是不可以改的,我要用C来实现这个功能就必须要先实现他这个错误的转换方法,不然最终得到的结果匹配不了)
我知道僵哥对这两种语言的基本东西都非常了解,希望你能帮帮我,谢谢。
WS := s;
s := ws;
这两句,看源代码怎么写的,翻译成C语言的
char *s;
wchar_t *ws;
s = "\x01\xBD\x3C\x32\0";
int iLen = strlen(s);
int iwLen = iLen;
ws = new wchar_t[iwLen+1];
iwLen = MultiByteToWideChar( CP_ACP,0,s,iLen,ws,iwLen+1);
ws[iwLen] = 0; iwLen = wcslen(ws);//这句可以不要 ShowMessage(iLen);//C++Builder写法,具体到程序的时候,可以通过printf,sprint等处理
ShowMessage(iwLen);
delete[] ws;
char *p = s;
*p++ = 1;
*p++ = 189;
*p++ = 60;
*p++ = 50;
*p = '\0';//字符串结束符
写了一个模仿数据丢失的函数,老大给我提供的几个测试数据也通过了。僵哥你能不能帮我看一下我按照这个方法写会不会有什么漏洞,下面我把我的转换函数也贴出来吧。/***********************************************************************************
* 函数名: ConverChar
* 编 写: DYZ;2009-2-10
* 修 改:
*
* 说 明: 由于在Delphi加密函数里String 转 WideString有数据丢失,为匹配加密结果
此函数功能为模仿Delphi 中的数据丢失
* 参 数:
in: 要转换的字符串
len:字符串的长度
* 返回值:
***********************************************************************************/
void ConverChar(uchar in[],int len)
{
int i,k=0; for ( i=0 ; i<len ; i++)
{
//如果当前值大于128 下一个值小于64,则改当前值为63,下一个值跳过
if ( in[i]>128 && in[i+1] && in[i+1]<64 )
{
in[k++] = 63;
i++;
}
//如果当前值大于128 下一个值大于等于64,则当前值和下一个值不变
else if (in[i]>128 && in[i+1] && in[i+1]>=64 )
{
in[k++] = in[i];
in[k++] = in[i+1];
i++;
}
//如果当前值小于等于128,则当前值不变
else if (in[i]<=128)
{
in[k++] = in[i];
}
//如果最后一个值大于 128 ,则当前值清0
else if (!in[i+1])
{
in[k++] = 0;
}
}
memset(in+k,0,len-k);
}我们要写的POS终端系统计算的结果一定要与以前做的Delphi程序匹配,所以比较重要。
正如楼上几位所说 其实并没有发生数据丢失,只是把 #189 当成unicode(汉字)来处理罢了。。