0

因此,经过大量研究后,我发现使用 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 函数只是为了那个场合......但我似乎不应该这样做......为什么不能我只是把它作为一个字节数组?

4

1 回答 1

2

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

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

进入:

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

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

于 2013-02-10T20:27:25.097 回答