【问题标题】:OPOS BSTR* not converting properlyOPOS BSTR* 未正确转换
【发布时间】:2013-02-10 20:06:40
【问题描述】:

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

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

问题是当我在我的服务对象中转换这个字符串时它没有正确转换它。即使 SysStringLen 知道长度是 4 字节,它似乎也停止在 null 上。示例控件对象这样做

        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 数组?

【问题讨论】:

  • 我想我可能只是回答了我自己的问题,因为我们也编写了一种不同类型的卡,我们发送一个表示字节数组的字符串并将其转换......所以我们应该坚持下去方法......无论如何都符合OPOS标准......但如果有人有建议,请随时告诉我:)

标签: c++ bstr opos


【解决方案1】:

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

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

进入:

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

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

【讨论】:

  • 哇,谢谢你给我打赏 :) 哈哈哈,所以在这个注释上,如果值是一个字符串,我应该以 null 结尾还是 Widechartomultibyte 为我这样做?我问是因为当它实际上是一个 4 字节数组时我不想有一个 5 字节数组.. 但显然对于一个字符串我需要那个结尾为 null 对吗?
  • WideCharToMultiByte 的 MSDN 文档中对此进行了说明。如果您将 -1 作为 cchWideChar 参数传递(这当然意味着您需要传递一个以空字符结尾的输入字符串),或者如果输入字符串在您传递的长度内包含一个空字符,则输出字符串将以空字符结尾cchWideChar。无论如何,在这种情况下,空终止它没有多大意义,因为字符串中有空字符。此外,通常以空字符结尾的字符串不好,你应该使用像 BSTR 这样的以长度为前缀的字符串,或者像 std::string、CString 等这样的字符串类
猜你喜欢
  • 1970-01-01
  • 2013-05-24
  • 2011-04-08
  • 2010-09-15
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多