描述:
最近在编写一个ATL,需要将带内嵌NULL字符的BSTR转成unsigned char,上网找例子,都没有较好的解决,基本上都是BSTR转成char*,而且是BSTR中间没有零字符的,用WideCharToMultiByte转换。经坛友tiewen指点,可以转带内嵌零字符的BSTR。
如果BSTR中是FF,用WideCharToMultiByte转换会变成3F,所以我必须转成unsigned char才行。
了解到BSTR的储存方式,我尝试用地址来引用,把BSTR看成一个数组,想不到,竟然成功了,太高兴了,拿来分享一下。下面是例子。
#include "stdafx.h"
#include "atlbase.h"
#include <stdio.h>
int main(int argc, char* argv[])
{
OLECHAR temp[10];
temp[0]=64;
temp[1]=0;
temp[2]=66;
temp[3]=255;
temp[4]=67;
temp[5]=255;
temp[6]=0;
temp[7]=66;
temp[8]=255;
temp[9]=67;
//打印源数据
for(int j=0;j<10;j++)
printf("%.2lX ",temp[j]);
printf("\n");
BSTR bstrText = SysAllocStringLen(temp, 10); //构建带内嵌零字符的BSTR
int a = SysStringLen(bstrText); //取BSTR长度
unsigned char* b=new unsigned char[a];
for(int k=0;k<a;k++)
{
b[k]=(unsigned char)bstrText[k]; //bstrText[k]是unsigned short,转换成 unsigned char
//打印源数据
printf("%.2lX ",bstrText[k]);
}
printf("\n");
//打印转换结果
for(int m=0;m<a;m++)
printf("%.2lX ",b[m]);
printf("\n");
//网上找到的转换,是转成char*
char *ansistr = new char[a];
memset(ansistr,0,a);
::WideCharToMultiByte(CP_ACP,
0,
bstrText,
a,
ansistr,
a,
NULL,
NULL);
//打印转换结果
for(int i=0;i<a;i++)
printf("%.2lX ",ansistr[i]);
printf("\n");
//释放BSTR
SysFreeString(bstrText);
return 0;
}
/* 运行结果如下:
40 00 42 FF 43 FF 00 42 FF 43
40 00 42 FF 43 FF 00 42 FF 43
40 00 42 FF 43 FF 00 42 FF 43
40 00 42 3F 43 3F 00 42 3F 43
Press any key to continue
*/
可以看出,前三行结果是一致的。说明这种转换是成功的。转换方法只要三句代码就行了:
int a = SysStringLen(bstrText);
unsigned char* b=new unsigned char[a];
for(int i=0; i<a; i++)b[i]=(unsigned char)bstrText[i];
解决方案1:
我只用一句话 unsigned char* p = COLE2A(bstrValue);
解决方案2:JF
解决方案3: 好,我们是成都一家软件企业,现在面向全国范围招聘C++程序员,
职位要求:
1、知识要求:熟悉软件工程,精通VC++开发环境,较强的软件设计能力,能熟练阅读英文资料;
2、经验要求:有规范的项目开发经验,C++/VC实际开发经验(不少于2年);
3、技能要求:熟悉windows9x/nt/2000操作系统接口(熟悉基于Windows操作系统的底层驱动程序开发优先);
4、素质要求:敬业、主动、易相处、有团队合作意识;
5、基本薪酬待遇:5000-8000元。
有意向请联系QQ:7994393
或者发送邮件:zhaopin@easeus.com.cn
再提一点,如果用你的方法转换,接收方收到数据也没法还原成原字符串??
解决方案5:再提一点,如果用你的方法转换,接收方收到数据也没法还原成原字符串??
解决方案6: W2A
OLE2A
T2A
...
mark 接分
解决方案8:up
解决方案9:mark
解决方案10: 谢谢楼主发布分享
学习了
接分
解决方案12:不错,谢谢
解决方案13:JF有理!!!!
解决方案14:谢谢了
解决方案15:你这个是不支持宽字符的吧?
解决方案16:好东西,谢谢分享
解决方案17:刚开始学习COM,有关的东西都感兴趣,接分~~
解决方案18: #include <comdef.h>
BSTR bstr = ....;
char* p = _bstr_t(bstr);
_bstr_t类有重载operator char*, operator wchar_t*....
有个宏
OLE2T
up
解决方案21:BSTR就是 w_char*,当然可以当作数组了。
解决方案22:jf,顺便说一下,有了lz的三句代码utf8就没用了@__@
解决方案23:啥也不说了,学习一下,顺便接个分
解决方案24:再提一点,如果用你的方法转换,接收方收到数据也没法还原成原字符串。
解决方案25:如果是这样,你取出字符串长度,然后用强制转换指针或内存拷贝都可以。
解决方案26: 不知道你这样转出来的结果是要做什么用的,你可以用printf把字符串打出来看看是什么。
如果只是要把BSTR中的二进制数取出来,直接强制转换指针类型或者内存拷贝就可以。
如果要转成UTF-8应该先写低字节再写高字节,或者用WideCharToMultiByte。
如果要转成使用GB2312编码的多字节字符串,要用WideCharToMultiByte。
你这“三行”代码把中文转成什么?
解决方案28:JF~
解决方案29: WideCharToMultiByte 是字符Unicode变换, 不是字符串在这里用那错了啊
如果BSTR中是FF,用WideCharToMultiByte转换会变成3F
因为当前代码页0x00FF没这个字符, 所以转换成 字符'?', 也就是0x3F
在抢地板
解决方案31:板凳
解决方案32:沙发