首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OPOS BSTR*转换不正确

OPOS BSTR*转换不正确
EN

Stack Overflow用户
提问于 2013-02-11 04:06:40
回答 1查看 469关注 0票数 0

因此,经过一系列的研究,我发现使用WideCharToMultiByte可以很好地将数据从控制对象通过OPOS发送到我的自定义SO。好吧,我们遇到了一个bug。在DirectIO部分,C#控件对象的映射是DirectIO(整型命令,引用整型数据,引用字符串对象);

在最长的时间里,我们只需要通过DirectIO发送简单的命令。例如,要打开LED,我们可以将数据设置为毫秒的长度,将对象设置为颜色。当我们需要将数据写入标签或卡片时,必须将文本从特殊的XML样式字符串解析为字节数组……现在,我们需要一个字节数组,使用ASCII编码将该数组转换为字符串形式,并将其写入。

问题是,当我在Service对象中转换这个字符串时,它没有正确地转换它。它似乎在null上停止,即使SysStringLen知道它的长度是4字节。例如,控件对象执行此操作

代码语言:javascript
复制
        int page = 16;
        byte[] data = new byte[] { 0x19, 0x00, 0x30, 0x00 };
        string pData = System.Text.ASCIIEncoding.ASCII.GetString(data);
        msr.DirectIO(902, ref page, ref pData);

SO看到了这一点

代码语言:javascript
复制
int len = (int)SysStringLen(*pString);
long dataData = *pData;
char* dataObject = new char[1+len];

WideCharToMultiByte(CP_ACP, 0, *pString, -1, dataObject, len, NULL, NULL);
ByteUtil::LogArray("dataObject", (BYTE*)dataObject, len);

产生以下输出

dataObject(4)-19:00:00:00

基本上,只要到达第一个空字符,其余的数据就会丢失。现在,如果我将数字从一个字符串转换成一个字符串,它就可以工作了,因为我有一个专门针对这种情况的ByteUtil函数……但对我来说这样做似乎并不合适...为什么我不能把它作为一个字节数组呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-11 04:27:25

非常简单,只需更改这一行:

代码语言:javascript
复制
WideCharToMultiByte(CP_ACP, 0, *pString, -1, dataObject, len, NULL, NULL);

进入:

代码语言:javascript
复制
WideCharToMultiByte(CP_ACP, 0, *pString, len, dataObject, len, NULL, NULL);

如果将第四个参数设置为-1,WideCharToMultiByte会将输入字符串视为以null结尾的字符串。出于兼容性原因,BSTR以null结尾,但您永远不应将它们视为null结尾,因为它们可以包含null字符作为字符串的一部分。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14802056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档