我写了个COM组件,用来实现字符串的压缩,遇到些问题,请大虾们帮忙,压缩和解压缩的函数如下:
STDMETHODIMP Czip::compress1(BSTR OriginalString, BSTR* CompactString)
{
Byte compr[204800];
uLong comprLen;
//入口的BSTR通过_bstr_t转换为const char* 
_bstr_t tempstr = OriginalString;
const char* hello = (char*)tempstr; uLong len = strlen(hello) + 1;
comprLen  = sizeof(compr) / sizeof(compr[0]);
//调用zlib进行压缩
compress(compr, &comprLen, (const Bytef*)hello, len);
//压缩完成后返回 *CompactString = ::SysAllocStringByteLen((LPCSTR)compr, comprLen);
         return S_OK; 
} STDMETHODIMP Czip::uncompress1(BSTR CompactString, BSTR* OriginalString)
{
const char* hello = (const char*)CompactString;
int len = ::SysStringByteLen(CompactString);

Byte uncompr[204800];
uLong uncomprLen; uncomprLen  = sizeof(uncompr) / sizeof(uncompr[0]);
//解压缩 
uncompress(uncompr, &uncomprLen, (const Bytef*)hello, len);

//对解压缩后的Byte[]数组转换为BSTR传出
_bstr_t  c((char *)uncompr);
*OriginalString = c.Detach(); return S_OK;
}目前COM在c#中调用正常,在js中调用正常,但是如果c#把压缩的结果通过一个隐含的文本域传递到前台,前台中js使用隐含的文本域中的值进行解压时不正常
估计原因出在压缩后的字符串通过文本域传递时,非法字符引起丢失,付上压缩后的结果例子:
鱸峭狩⫳봌䒏㛏��釿Ʈ按᠂꒼틽馓剌③ᚁ聴遪볂栗��衍馾묿ﷹ뾜뿏ཷ��뼸獵羭㮟싴奄舘褯ꭦ럦羴ᴷ룑柛魝蟇쯹ﴻ立㽻珒욚태ḍ支턤쑐뭳沜骛原봣̵籂鳑飰阞禿㏱漴뉢稟娜윆욇徥덃᩼⫹뜫퓵燺悯竮燖捋獵꿐瑩찚鈳䅴뎶뇒崠곞핮ꛜ姆婯욗��ὧ뛓㩩끲㶟ﭨ幩懪濕潾욈粃鉁웾߅붸䣯ڀ貹異⍳ꐟ㊹䃳썾殿��閎쾢��㇧椩㛿젴竆꟢죽㡱��账芌鋦䋵ꖾ큽꯯知祽ﳎㄸ왥퀴␘ꎍㆥ⾴鶗듽江隳쬆涔��폘漾旸瓴⼺⿏욙ﲥ䯮䍿놻릶��譴녯垭꿋Ṩ腮睾쏈軬趞㏑㗳ឍ嬛汯嫣⤦巩⍊紛��﨓䷚��㼹闙畽뚯螼ⱞ㤗鍌⏗鱱䝖譫鹹櫨垝闑⺖垷죙��ﳫ寄൏䣍꼻ᶳ��戧㥴션ᰴ⎏龴뭞鍏ታฯ첖쮁▓ộ黽笿⛩ﵭ��춡孫໨䇌栋ᬻ㗥穋䨱ퟻ袗쯆婪鲑䢷᳿✧군じ㶛쯥Ṧ縲禣擶骛櫖ᬽ崭孧鞜홆❓��媠瓸所以在想有什么办法可以解决?
1\压缩后返回16进制编码后的字符串(1F2A3W......),然后再解压中再把16进制的字符串转回来?
2\其他什么办法?由于对vc++不太懂,所以求助于各位大虾们

解决方案 »

  1.   

    压缩后的字符串通过文本域传递...
    ------------------------
    你自己判断的非常有道理,从文本域传递压缩数据无论是BSTR还是其它格式都会遇到这个问题。不知道你的应用是什么情况,换一换COM解压的位置会怎样。在COM里面估计没有什么可以做的。
      

  2.   

    我对js不熟,能不用类似byte[]的方式传递,这样不会有字符丢失了。
    LZ你懂我的意思么?
      

  3.   

    返回16进制的数字可以用
    sprintf("%02X",buf[i]).......
      

  4.   

    读的时候sscanf(...."%x".....)
      

  5.   

    转到文本域的时候直接用BSTR类型的结构体看看,中间不要转变成其他类型的数据.
      

  6.   

    对压缩后的数据进行base64编码,或者用安全数组的形式保存数据,返回给调用者
      

  7.   

    js就是javascript,在JS中只认识普通的文本string,所以安全数组或者其它的方式不好传
    sprintf在com是否好用,怎么用?
    byte[]数组js不认识我想知道BSTR能否转为16进制字符串,如果能怎么转?
    例如:  private static string ByteArrayToHexString(byte[] bytes) 
      {   if ( bytes == null || bytes.Length == 0 )    throw new ArgumentException( "bytes [] 参数出错" );   StringBuilder hexString = new StringBuilder( 2 * bytes.Length );   for ( int i = 0; i < bytes.Length; i++ )
        hexString.AppendFormat( "{0:X2}", bytes[i] );   return hexString.ToString();  }
    这个应该怎么变成ATL编写com时能认识的代码?
      

  8.   

    还有个问题请教
    *CompactString = ::SysAllocStringByteLen((LPCSTR)compr, comprLen); 
    在这句之前获取compr长度是定义的204800
    在这句之后获取的*CompactString的长度却不是我的理解是compr定义为204800,所以长度必定为204800,只是其中部分有数据而已,比如compr[0]到compr[1024]有数据,则实际compr的有效数据长度为1024,但是如何获得compr的有效数据长度呢?如果能获取,我是否可以直接把这些有效数据转换为16进制的字符,然后再输出?如果可以该怎么编码呢?本人比较菜,非常希望大虾们指点