2013-02-10 70 views
0

因此,經過一系列研究後,我發現使用WideCharToMultiByte非常適合通過OPOS將控制對象的數據發送到我的自定義SO。我們遇到了一個錯誤。在DirectIO部分,C#控制對象的映射是DirectIO(int命令,ref int data,ref字符串對象);OPOS BSTR *沒有正確轉換

並且我們只需要通過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

基本上立即輸出作爲TEH第一個空字符達到的其餘部分數據丟失。現在,如果我將字符串中的數字轉換爲字符串,那麼可以正常工作,因爲我有一個ByteUtil函數用於該場合...但對於我來說這似乎不正確...爲什麼不能我只是把它作爲BYTE數組?

+0

我想我也許只是回答我自己的問題在不同類型的卡,我們寫得太我們發送一個表示字節數組,並將其轉換爲字符串...所以我們應該堅持這種方法......和這符合OPOS標準無論如何...但如果任何人有一個建議,請隨時告訴我:) – 2013-02-10 20:18:44

回答

2

非常簡單,只需改變這一行:

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

到:如果第四個參數設置爲-1

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

,調用WideCharToMultiByte把輸入的字符串作爲空終止字符串。出於兼容性的原因,BSTR是空終止的,但不應將它們視爲空終止,因爲它們可以包含空字符作爲字符串的一部分。

+0

哇,謝謝你給我:)哈哈哈,所以在這個說明然後如果值是一個字符串,我應該結束它一個null或將widechartomultibyte爲我做?我問,因爲我不想有一個5字節的數組,當它真的是一個4字節的數組..但顯然對於一個字符串,我需要結束null正確的? – 2013-02-11 01:07:47

+1

這在WideCharToMultiByte的MSDN文檔中得到了擴展。如果傳遞-1作爲cchWideChar參數(當然,這意味着需要傳遞的空終止輸入的字符串),或者如果輸入的字符串中包含的長度內的空字符傳遞作爲輸出字符串將是空終止cchWideChar。無論如何,在這種情況下,由於空字符作爲字符串的一部分,所以對它進行空終止沒有多大意義。此外,以空字符結尾的字符串通常不好,您應該使用長度前綴的字符串(如BSTR)或字符串類(如std :: string,CString等) – user1610015 2013-02-11 01:30:03