因此,经过一系列的研究,我发现使用WideCharToMultiByte可以很好地将数据从控制对象通过OPOS发送到我的自定义SO。好吧,我们遇到了一个bug。在DirectIO部分,C#控件对象的映射是DirectIO(整型命令,引用整型数据,引用字符串对象);
在最长的时间里,我们只需要通过DirectIO发送简单的命令。例如,要打开LED,我们可以将数据设置为毫秒的长度,将对象设置为颜色。当我们需要将数据写入标签或卡片时,必须将文本从特殊的XML样式字符串解析为字节数组……现在,我们需要一个字节数组,使用ASCII编码将该数组转换为字符串形式,并将其写入。
问题是,当我在Service对象中转换这个字符串时,它没有正确地转换它。它似乎在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函数……但对我来说这样做似乎并不合适...为什么我不能把它作为一个字节数组呢?
发布于 2013-02-11 04:27:25
非常简单,只需更改这一行:
WideCharToMultiByte(CP_ACP, 0, *pString, -1, dataObject, len, NULL, NULL);进入:
WideCharToMultiByte(CP_ACP, 0, *pString, len, dataObject, len, NULL, NULL);如果将第四个参数设置为-1,WideCharToMultiByte会将输入字符串视为以null结尾的字符串。出于兼容性原因,BSTR以null结尾,但您永远不应将它们视为null结尾,因为它们可以包含null字符作为字符串的一部分。
https://stackoverflow.com/questions/14802056
复制相似问题