gpt4 book ai didi

c++ - OPOS BSTR* 转换不正确

转载 作者:行者123 更新时间:2023-11-28 03:23:26 25 4
gpt4 key购买 nike

因此,经过一系列研究后,我发现使用 WideCharToMultiByte 非常适合通过 OPOS 将数据从控制对象发送到我的自定义 SO。好吧,我们遇到了一个错误。在 DirectIO 部分,C# 控制对象的映射是 DirectIO(int command, ref int data, ref string object);

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

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

        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 看到了这个

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 函数只是为了那个场合......但我必须这样做似乎不合适......为什么不能我只是把它作为一个 BYTE 数组?

最佳答案

很简单,只需更改这一行:

WideCharToMultiByte(CP_ACP, 0, *pString, -1, dataObject, len, NULL, NULL);

进入:

WideCharToMultiByte(CP_ACP, 0, *pString, len, dataObject, len, NULL, NULL);

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

关于c++ - OPOS BSTR* 转换不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14802056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com