![](/img/trans.png)
[英]Converting vector<unsigned char> to const unsigned char*
[英]Converting vector<unsigned char> which contains /0 in it to char* without losing data?
我有一個服務器客戶端程序,我嘗試將二進制數據從我的 C++ 服務器發送到我的 C# 客戶端。 當我嘗試將數據從我的vector<unsigned char>
轉換為char*
時,我注意到只發送了一半的數據,我擔心這可能是因為我的數據中包含\0
。
我這樣轉換:
const char* response = reinterpret_cast<char*>(requestResult.response.data());
我的數據如下所示:
[0]: 204 'Ì'
[1]: 0 '\0'
[2]: 0 '\0'
[3]: 0 '\0'
[4]: 12 '\f'
[5]: 123 '{'
[6]: 34 '\"'
[7]: 115 's'
[8]: 116 't'
[9]: 97 'a'
[10]: 116 't'
[11]: 117 'u'
[12]: 115 's'
[13]: 34 '\"'
[14]: 58 ':'
[15]: 49 '1'
[16]: 125 '}'
當我在轉換后檢查結果時,我只看到數據中的第一個字節( 204 - 'Ì' ),這有點問題:]
發送本身是使用這個 function 使用 socket.cpp 完成的:
{
if (send(sc, (char*)message, strlen((char*)message), 0) == INVALID_SOCKET)
{
throw std::exception("Error while sending message to client");
}
}
如何將這樣的數據轉換為 char*,以便正確發送所有數據?
你的問題是
strlen((char*)message)
strlen
將在“c-string”中的第一個 null 字符處停止,這就是為什么您只能在第一個 null 字符之前獲取數據。 幸運的是,您可以通過傳遞向量的大小而不是使用strlen
來解決這個問題。 看起來像
send(sc, (char*)message, name_of_vector.size(), 0)
當我在轉換后檢查結果時,我只看到數據中的第一個字節( 204 - 'Ì' )
怎么查,字符串打印? 那東西不是字符串,它是大小為requestResult.response.size()
的數據緩沖區。 如果您相應地打印它,您將看到沒有數據丟失。
這是雙重事實,因為在您顯示的代碼中沒有進行數據處理, data()
返回一個指向內部數據緩沖區的指針並且沒有進一步的更改。
對我來說,為什么在看起來像 JSON 的前四個字節中有隨機垃圾對我來說並不完全清楚,但最簡單的方法就是使用requestResult.response.data() + 4
。 此外,無需重新解釋任何內容,數組中的項目已經是char
。
編輯,因為您添加了發送 function:正如我上面所說,只需使用正確的大小:
send(sc, requestResult.response.data(), requestResult.response.size(), 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.