我正在使用NetLink套接字庫(https://sourceforge.net/apps/wordpress/netlinksockets/),並且我想通過網絡以我指定的格式發送一些二進制數據。將unsigned int +字符串轉換爲unsigned char向量
我已計劃的格式是非常簡單的並且是如下:
字節0和1:類型uint16_t的操作碼(即,無符號整數總是2個字節長)
字節2向前:任何其他必要的數據,如字符串,整數,每個數據的組合等等。另一方將根據操作碼解釋這些數據。例如,如果操作碼爲0表示「登錄」,則此數據將由一個字節的整數組成,告訴您用戶名有多長,後跟包含用戶名的字符串,後跟包含密碼的字符串。對於操作碼1,「發送聊天消息」,這裏的整個數據可能只是聊天消息的一個字符串。
這裏是圖書館給我一起工作用於發送數據,但:
void send(const string& data);
void send(const char* data);
void rawSend(const vector<unsigned char>* data);
我假設我想用rawSend()這個..但rawSend()採用無符號字符,而不是void *指向內存?如果我嘗試將某些類型的數據轉換爲無符號字符數組,那麼在這裏是不是會有一些數據丟失?如果我錯了,請糾正我。但如果我是對的,這是否意味着我應該看看另一個支持真正的二進制數據傳輸的庫?
假設這個庫確實服務於我的目的,我將如何將我的各種數據類型轉換並連接到一個std :: vector中?我已經試過是這樣的:
#define OPCODE_LOGINREQUEST 0
std::vector<unsigned char>* loginRequestData = new std::vector<unsigned char>();
uint16_t opcode = OPCODE_LOGINREQUEST;
loginRequestData->push_back(opcode);
// and at this point (not shown), I would push_back() the individual characters of the strings of the username and password.. after one byte worth of integer telling you how many characters long the username is (so you know when the username stops and the password begins)
socket->rawSend(loginRequestData);
遇到了一些例外,不過,就當我試圖解釋數據的另一端。我是否接近全部錯誤?我會通過轉換爲無符號的字符來丟失數據嗎?
在此先感謝。
而不是所有的條件編譯,你應該使用'hton_s'來將數字轉換爲網絡順序。 –
有條件的編譯是用來以更簡潔的形式解釋你的選項,而不是更多段落的文本。我完全期望OP選擇一個選項並刪除其餘部分。 –
這看起來不錯,但static_cast調用都拋出了一個編譯錯誤: 錯誤C2440:'static_cast':無法從'uint16_t *'轉換爲'const unsigned char *' – Josh1billion