• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 经验分享(散分来了):BSTR转换成unsignedchar的最简便方法(只需三句代码)

经验分享(散分来了):BSTR转换成unsignedchar的最简便方法(只需三句代码)

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了 经验分享(散分来了):BSTR转换成unsignedchar的最简便方法(只需三句代码)等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 经验分享(散分来了): BSTR 转换成 unsigned char 的最简便方法(只需三句代码)
描述:

   最近在编写一个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 

解决方案4:

再提一点,如果用你的方法转换,接收方收到数据也没法还原成原字符串??

解决方案5:

再提一点,如果用你的方法转换,接收方收到数据也没法还原成原字符串??

解决方案6:

W2A
OLE2A
T2A
...

解决方案7:

mark 接分

解决方案8:

up

解决方案9:

mark

解决方案10:

谢谢楼主发布分享
学习了

解决方案11:

接分

解决方案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*....

解决方案19:

有个宏
OLE2T

解决方案20:

up

解决方案21:

BSTR就是 w_char*,当然可以当作数组了。

解决方案22:

jf,顺便说一下,有了lz的三句代码utf8就没用了@__@

解决方案23:

啥也不说了,学习一下,顺便接个分

解决方案24:

再提一点,如果用你的方法转换,接收方收到数据也没法还原成原字符串。

解决方案25:

如果是这样,你取出字符串长度,然后用强制转换指针或内存拷贝都可以。

解决方案26:

不知道你这样转出来的结果是要做什么用的,你可以用printf把字符串打出来看看是什么。
如果只是要把BSTR中的二进制数取出来,直接强制转换指针类型或者内存拷贝就可以。
如果要转成UTF-8应该先写低字节再写高字节,或者用WideCharToMultiByte。
如果要转成使用GB2312编码的多字节字符串,要用WideCharToMultiByte。

解决方案27:

你这“三行”代码把中文转成什么?

解决方案28:

JF~

解决方案29:

WideCharToMultiByte 是字符Unicode变换, 不是字符串在这里用那错了啊
如果BSTR中是FF,用WideCharToMultiByte转换会变成3F 
因为当前代码页0x00FF没这个字符, 所以转换成 字符'?', 也就是0x3F

解决方案30:

在抢地板

解决方案31:

板凳

解决方案32:

沙发


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-06-05 请教如何枚举出当前系统运行进程的信息?
  • 2017-06-04 如何在activex控件当中调用其他的activex控件
  • 2017-06-05 请帮忙看一下这个AfxBeginThread的问题
  • 2017-06-04 CShockwaveFlash与IE交互
  • 2017-06-05 DLL的导出函数该用什么调用标记才能让delphi正确调用?
  • 2017-06-05 临界区全局变量保护问题
  • 2017-06-04 RichEidt插入ActiveX的问题--------?网上等????
  • 2017-06-05 closehandle的问题
  • 2017-06-04 “关于activeX在Web中应用的问题”我是新手,请各位大虾帮忙。
  • 2017-06-04 不使用IDL如何定义一个接口?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 有没有这样的map
    • 各位大虾,一个关于COM的问题
    • 网页中的Com组件,怎么样能够穿过NTLM默认认证的代理服务器
    • Excel操作问题!紧急!!!
    • 有人实现这样的功能吗?atl/asp组件
    • 多线程读串口问题
    • WebBrowser控件在DLL里面使用问题
    • vc60下写的opencv打开图片的程序,编译通过,可是运行时一闪而过,求问大神解决方法!
    • 请教读写exe文件的问题
    • 如何将word中的链接图片改为内嵌图片?谢谢。

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有