Поэтому после нескольких исследований я обнаружил, что использование WideCharToMultiByte отлично работает для отправки данных из объекта управления через OPOS в мою пользовательскую SO. хорошо мы столкнулись с ошибкой. В части DirectIO карта объекта управления C # — DirectIO (команда int, ref int data, ref string object);
и для самых длинных нам нужно было только отправить простые команды через DirectIO. Например, чтобы включить светодиод, мы должны установить длину данных в миллисекундах и цвет объекта. Когда нам нужно было записать данные в тег или карту, текст должен был быть проанализирован из специальной строки в стиле XML в байтовый массив … ну, теперь возникла необходимость в том, чтобы нам был байтовый массив, используйте кодировку ASCII поместить этот массив в строковую форму и написать
Проблема возникает из-за того, что когда я конвертирую эту строку в мой объект службы, она не конвертируется правильно. кажется, что он останавливается на нуле, хотя 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);
ТАК видит это
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 обрабатывает входную строку как строку с нулевым символом в конце. BSTR имеют нулевое окончание по соображениям совместимости, но вы никогда не должны обращаться с ними как с нулевым символом в конце, поскольку они могут содержать нулевые символы как часть строки.
Других решений пока нет …