请教同时熟悉C++和C#高手:C++中如何处理C#的byte[]类型

班小冰 2010-12-22 11:38:55
小弟是C#出身,目前正在学习VC(基于VS2008)。现在基于C#封装了Web Service中的一个方法:
byte[] ANZoomIn(double PressX,double Y)。该方法的作用是根据屏幕触发点坐标生成一张图片,然后将图片转换为C#的二进制的流byte[]返回。在WebService中C#的byte[]类型被Soap1.2描述为base64Binary,如下:

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<ANZoomInResponse xmlns="http://tempuri.org/">
<ANZoomInResult>base64Binary</ANZoomInResult>
</ANZoomInResponse>
</soap12:Body>
</soap12:Envelope>

小弟现在基于C++开发了一个Winform的客户端程序,但不知道在C++如何将WebService的base64Binary类型的返回值解析为自己识别的类型,然后将该二进制流还原为一张图片,最后执行贴图操作
如果是C#端的Winform程序,解析比较简单,只需要以下三步操作即可:
byte[] buffer = MyService.ANInitialWebService(); //直接在C#中以byte[]接收WebService中函数的返回值
MemoryStream mStream = new MemoryStream(buffer); //定义内存流
Bitmap map = new Bitmap(mStream); //基于内存流得到图片Bitmap类型
还请大家不吝赐教,最好能给出相应的C++的实现代码,小弟的C++基础比较薄弱
...全文
568 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
班小冰 2010-12-24
  • 打赏
  • 举报
回复
谢谢甘草朋友的思路,小弟按照他的思路先将WebService中的Base64解码为C++的Byte[],然后使用MFC的CBitMap类在DC中绘图。另外还要感谢彤彤的想法,虽然一直没有试验,但也不失为解决问题的一种思路。
healer_kx 2010-12-22
  • 打赏
  • 举报
回复
C++, 估计你也是 VS开发吧?

有 BYTE buffer[], BYTE == unsigned char



DWORD Encode(const BYTE* pData, DWORD dwDataLen, LPWSTR base64str, DWORD dwBufferLen)
{
DWORD dwBase63StrLen = dwBufferLen;
BOOL bCrypt = CryptBinaryToString(pData, dwDataLen, CRYPT_STRING_BASE64, base64str, &dwBase63StrLen);
if (bCrypt)
{
return dwBase63StrLen;
}
return 0;
}

这个函数帮你Base64编码,

还是这个API,可以用于Base64的解码。
CryptBinaryToString
gules 2010-12-22
  • 打赏
  • 举报
回复
如果你使用的是标准C++(没有托管的),那么你需要将byte[]封送转换到IntPtr,然后将这个(指针)值传递给C++,C++中可以使用DWORD类型或void*类型,再转换成unsigned char*即为所需内存流。
hai040 2010-12-22
  • 打赏
  • 举报
回复
试试typeid(MyService.ANInitialWebService()).name()是什么

也可以找下相关的库
班小冰 2010-12-22
  • 打赏
  • 举报
回复
楼上的兄弟能否再详细的介绍下思路,最好贴出C++代码。小弟的C++还比较薄弱。此外小弟查了下base64Binary好像在C++中应该被解析为SAFEARRAY,而且C++中好像也没有byte[]类型吧。
healer_kx 2010-12-22
  • 打赏
  • 举报
回复
base64要转码,转成byte[],然后再给Bitmap类。
班小冰 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 healer_kx 的回复:]
C++, 估计你也是 VS开发吧?

有 BYTE buffer[], BYTE == unsigned char


C/C++ code


DWORD Encode(const BYTE* pData, DWORD dwDataLen, LPWSTR base64str, DWORD dwBufferLen)
{
DWORD dwBase6……
[/Quote]

谢谢楼上的朋友了,小弟还想问下,在C++里面,怎么把解码后的内存流转换成图片呀。能不能再贴些代码出来,小弟不胜感激
班小冰 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gules 的回复:]
如果你使用的是标准C++(没有托管的),那么你需要将byte[]封送转换到IntPtr,然后将这个(指针)值传递给C++,C++中可以使用DWORD类型或void*类型,再转换成unsigned char*即为所需内存流。
[/Quote]
我刚开始学习C++,开发平台用的是VS2008,不知道这个是不是属于标准C++呢?

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧