下面这段程序在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来实现这个功能就必须要先实现他这个错误的转换方法,不然最终得到的结果匹配不了)
我知道僵哥对这两种语言的基本东西都非常了解,希望你能帮帮我,谢谢。

解决方案 »

  1.   

    Delphi 里 这种强制转换数据丢失的现象有没有什么规律可循?
      

  2.   

    ANSI转unicode怎么可能数据丢失
      

  3.   

    我们公司的程序是使用Delphi 6 开发的,现在数据丢失是肯定出现了,例子如上。我们用Delphi写的这样转换的程序是不可以重新编译的,主要是在C这边,我怎么才可以模仿这种现象呢?
      

  4.   

    自己打断点调试
      WS := s;
      s := ws;
    这两句,看源代码怎么写的,翻译成C语言的
      

  5.   

    用string类型出现数据丢失是因为#189的问题,#189被认为是汉字的一般,解析出来不是你想要的东西
      

  6.   

    参开http://topic.csdn.net/u/20090115/16/89cd5983-750a-47d6-8f1b-12d2e5d4fdc2.html
      

  7.   


    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;
      

  8.   

    唉,那几个bytes本来就没丢,被当gb18030的一个字符转unicode了,你要是再转回gb18030来还是那几个bytes
      

  9.   

    MultiByteToWideChar 是windows API里面的东西,我要运行的是在一个POS机里面,这个方法应该是不行了,另外我把你的代码放在VC6里编译没问题,一运行就出内存错误(我是使用.c结尾的文件保存的,new 改成了 malloc)。我是想在C里模仿Delphi里面的强制转换也丢失数据, 本来 s := #1+#189+#60+#50 ;, 转换后要变成 #1 +#63 + #50;
      

  10.   

    不是那样子写的。//s先要分配足够的内存
    char *p = s;
    *p++ = 1;
    *p++ = 189;
    *p++ = 60;
    *p++ = 50;
    *p = '\0';//字符串结束符
      

  11.   

    要看pos机用的是什么系统,如果是wince应该也支持MultiByteToWideChar这个API,具体到不同系统要使用其中相应的API。我能够提供的只是一种处理方法。
      

  12.   

    MultiByteToWideChar 在我这个POS机里是肯定不行的(已经测试过了),现在我通过下面这个帖子的六楼http://topic.csdn.net/t/20050920/09/4280815.html
    写了一个模仿数据丢失的函数,老大给我提供的几个测试数据也通过了。僵哥你能不能帮我看一下我按照这个方法写会不会有什么漏洞,下面我把我的转换函数也贴出来吧。/***********************************************************************************
    * 函数名: 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程序匹配,所以比较重要。
      

  13.   

    不清楚你的Pos机用的是什么系统,如果是Wince,那么根据MSDN介绍,对该API的支持情况是:Windows CE OS 1.01 and later ,include Winnls.h 对于linux平台,应该有iconv.h,其中有相关的转换函数。
      

  14.   

    MultiByteToWideChar也不会发生数据丢失的现象。
    正如楼上几位所说 其实并没有发生数据丢失,只是把 #189 当成unicode(汉字)来处理罢了。。
      

  15.   

    这是福建新大陆自己开发的 NL8300 POS 他们除了提供自己的功能性接口外,只实现了C标准库里面的几个单元的常用方法。编译器都是他们提供的。
      

  16.   

    如果是这样子的话,除非你自己对内容进行识别,否则没办法处理。对于你的需求当中,比较关键的就是判断LeadByte。当碰到LeadByte,那么就认为它是由多个字节组成的(中文一般就两个字节)。比如你从128~255之间的值,在标准的系统当中通过判断IsLeadByte,然后记录下来,生成一个基本的“多字节字符的首字节”码表,然后再在目标系统录中使用即可完成判断。
      

  17.   

    我明白了,我上面的转换函数是把128~225之间的所有值都当成LeadByte了,你的意思是说让我先判断一下并记录下来是吧。