2012-07-27 50 views
-1

我有一個結構用C轉印C結構的至C#結構由SOKET API

typedef struct config 
{ 
    char terminal_id[4]; 
    char update_version[6]; 
    char sub_app[6]; 
    char day[6]; 
    char month[6]; 
    char year[6]; 
    char hours[6]; 
    char minutes[6]; 

}; 

欲寫在C(如上所述)的配置的陣列中的C#轉移到一個結構,我只有字節類型的數據接收在C#套接字。任何想法?

+3

所有這些char *都表示零終止的字符串嗎?他們的編碼是什麼? ANSI,ASCII,UTF-8? – CodesInChaos 2012-07-27 07:06:17

+0

是的,請想象它們是像[恆定大小]的數組 – Robustness 2012-07-27 07:30:17

+0

恆定大小的數組和零終止的字符串是不同的東西。那它是哪一個?而且你也沒有回答編碼。 – CodesInChaos 2012-07-27 07:34:53

回答

0

由於您掌握了結構,知道它有多少個字段,因此應該很容易按「原樣」發送字符串,但包含終止的'\0'字符,因此您知道一個字符串結束且下一個開始(或者消息結束於最後一個字符串)。

在接收端,每次讀取一個字符時附加到正確的字段,當您收到一個字符爲零(而不是'0',但文字值0),那麼你知道一個字符串結束,下一個開始(或整個結構如果你收到最後一個字符串)。

您可以使用它,因爲C#字符串不必事先分配。另一種解決方案不是傳輸字符串終結符,而是先發送一個包含字符串長度的固定大小的整數。

編輯:如果接收C#端的結構將字符串作爲固定大小的字節數組,那麼您仍然可以使用我提出的算法。一次讀一個字符,然後做例如struct.buffer1[i++] = ch;。當數組已滿或您收到字符串終止符時,請重置計數器(前面的示例中爲i),然後開始接收下一個字符串。請記住,如果字符串比接收到的字符串長,則必須繼續閱讀字符,直到字符串結束,但只是丟棄它們。

我提到的另一種解決方案是,將每個字符串的長度預先設置爲更有效,但最好的情況是您只需在C端執行兩次寫入操作,並在C#端執行兩次讀取操作。爲了不必擔心字節順序,將該長度作爲固定長度的文本字段發送,例如,發送字符串"foobar"你實際上發送兩個字符串" 6""foobar"。在接收端,首先進行四個字符的單次讀取,將字符串轉換爲整數,然後將該值用作實際字符串的長度。

+0

請想象他們是像[恆定大小]的陣列 – Robustness 2012-07-27 07:30:44

+0

@Robustness更新了我的答案 – 2012-07-27 07:56:44