簡體   English   中英

轉換向量<unsigned char>其中包含 /0 到 char* 而不會丟失數據?</unsigned>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM