我正在嘗試序列化一個物件以在套接字中發送,但由于某種原因,當我使用 << 添加到字串流時,我還在它后面添加了“0b”,我試圖尋找可能導致這(例如故障資料型別)但到目前為止我什么也沒想到。
這是我在序列化之前在記憶體中的物件-
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 03 0b 00 cc ff 00 00 00
這是我用于序列化的 ostream 的記憶體 -
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 03 0b 03 0b 00 ff 00 00 00
這是類本身和序列化的多載
`
std::ostream& operator << (std::ostream& os, Header H)
{
os << H.CID;
os << H.Version;
os << H.FirstTwoCode;
os << H.LastTwoCode;
os.write(reinterpret_cast<const char*>(&H.Payload_size), sizeof(int));
return os;
}
class Header
{
UINT8 CID[CLIENTID_BYTE_SIZE];
unsigned char Version;
unsigned char FirstTwoCode;
unsigned char LastTwoCode;
int Payload_size ;
}
Header::Header(UINT8 clientID[CLIENTID_BYTE_SIZE], int request_code, int PL_SIZE)
{
memcpy(CID, clientID, CLIENTID_BYTE_SIZE);
Version = char(VERSION_NUMBER);
FirstTwoCode = char(request_code / 100);
LastTwoCode = char(request_code % 100);
Payload_size = PL_SIZE;
}
`
我已經嘗試在網上搜索,并且檢查了很多次,我認為這可能與我將整數保存在字符中有關,并且強制轉換正在做某事,但我不確定。
uj5u.com熱心網友回復:
你的錯誤在這一行:
os << H.CID;
它在這里呼叫 (2) 的 unsigned char 多載:https ://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2 ,這意味著它只會寫入Header物件的記憶體,直到第一個空位元組。
為了實作你真正想要的,你可以做類似的事情
os.write(reinterpret_cast<char const*>(H.CID), CLIENTID_BYTE_SIZE);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/529644.html
標籤:C 插座序列化二进制
