我写了个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++不太懂,所以求助于各位大虾们
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++不太懂,所以求助于各位大虾们
------------------------
你自己判断的非常有道理,从文本域传递压缩数据无论是BSTR还是其它格式都会遇到这个问题。不知道你的应用是什么情况,换一换COM解压的位置会怎样。在COM里面估计没有什么可以做的。
LZ你懂我的意思么?
sprintf("%02X",buf[i]).......
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时能认识的代码?
*CompactString = ::SysAllocStringByteLen((LPCSTR)compr, comprLen);
在这句之前获取compr长度是定义的204800
在这句之后获取的*CompactString的长度却不是我的理解是compr定义为204800,所以长度必定为204800,只是其中部分有数据而已,比如compr[0]到compr[1024]有数据,则实际compr的有效数据长度为1024,但是如何获得compr的有效数据长度呢?如果能获取,我是否可以直接把这些有效数据转换为16进制的字符,然后再输出?如果可以该怎么编码呢?本人比较菜,非常希望大虾们指点