由於您掌握了結構,知道它有多少個字段,因此應該很容易按「原樣」發送字符串,但包含終止的'\0'
字符,因此您知道一個字符串結束且下一個開始(或者消息結束於最後一個字符串)。
在接收端,每次讀取一個字符時附加到正確的字段,當您收到一個字符爲零(而不是'0'
,但文字值0
),那麼你知道一個字符串結束,下一個開始(或整個結構如果你收到最後一個字符串)。
您可以使用它,因爲C#字符串不必事先分配。另一種解決方案不是傳輸字符串終結符,而是先發送一個包含字符串長度的固定大小的整數。
編輯:如果接收C#端的結構將字符串作爲固定大小的字節數組,那麼您仍然可以使用我提出的算法。一次讀一個字符,然後做例如struct.buffer1[i++] = ch;
。當數組已滿或您收到字符串終止符時,請重置計數器(前面的示例中爲i
),然後開始接收下一個字符串。請記住,如果字符串比接收到的字符串長,則必須繼續閱讀字符,直到字符串結束,但只是丟棄它們。
我提到的另一種解決方案是,將每個字符串的長度預先設置爲更有效,但最好的情況是您只需在C端執行兩次寫入操作,並在C#端執行兩次讀取操作。爲了不必擔心字節順序,將該長度作爲固定長度的文本字段發送,例如,發送字符串"foobar"
你實際上發送兩個字符串" 6"
和"foobar"
。在接收端,首先進行四個字符的單次讀取,將字符串轉換爲整數,然後將該值用作實際字符串的長度。
所有這些char *都表示零終止的字符串嗎?他們的編碼是什麼? ANSI,ASCII,UTF-8? – CodesInChaos 2012-07-27 07:06:17
是的,請想象它們是像[恆定大小]的數組 – Robustness 2012-07-27 07:30:17
恆定大小的數組和零終止的字符串是不同的東西。那它是哪一個?而且你也沒有回答編碼。 – CodesInChaos 2012-07-27 07:34:53