[英]C++, pack integer bytes into a char array?
我正在通過網絡傳輸數據,因此嘗試設置一個標頭,其中前 3 個字節是消息類型,接下來的 4 個字節是消息的大小。 當我添加一個整數時,對於超過 127 個字節的任何內容,我都溢出了。 我如何設置這樣的標題?
這是一個簡單的例子。 如果 num 為 127 或更少,則輸出是正確的,但如果 num 為 128 或更多,則輸出完全混亂。
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;
string bytesAsStr(char* src, int size)
{
stringstream ss;
ss << std::hex;
for (int i = 0; i < size; i++)
{
ss << std::setw(2) << std::setfill('0') << (int)src[i] << " ";
}
return ss.str();
}
int main()
{
// 3 chars + 1 int
const int size = 3 + sizeof(int);
char x[size];
memcpy(x, "lsa", 3);
int num = 129;
memcpy(x + 3, &num, sizeof(int));
cout << bytesAsStr(x, size) << endl;
int out = *(x + 3);
cout << "out: " << out << endl;
}
如果 num 為 127 或更少,則輸出是正確的,但如果 num 為 128 或更多,則輸出完全混亂。
看來您正在談論代碼的以下部分,您嘗試從 char 數組中讀取整數然后顯示它:
int out = *(x + 3);
cout << "out: " << out << endl;
問題是x + 3
是char*
類型,當您取消引用它時,它變成了一個char
值。 在您的系統上,該值是有符號的,整數顯然是以小端格式存儲的。 所以,你認為它對小於 128 的值“有效”。但實際上這甚至不是真的。 對於小於 -128 的值,它也會中斷。
你看,即使你把它分配給一個int
,它仍然只是一個char
。 該 char 值只是被復制到更大的整數類型中。
看起來你真的想要這個:
int out = *(int*)(x + 3); // DON'T DO THIS!
這稱為類型雙關(將某些內存視為包含另一種類型),應該避免!!!
相反,您應該像復制字節一樣復制字節:
int out;
memcpy(&out, x + 3, sizeof(out));
另請注意,如果您計划通過網絡傳輸二進制數據,則任何讀取此數據的機器都必須了解其字節序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.