[英]C++ How to prefix uint16_t in front of uint8_t *buffer
下面是我如何使用 FlatBuffers 創建我的消息以及我如何使用 Boost ASIO 通過 TCP 發送它。
flatbuffers::FlatBufferBuilder builder;
auto email = builder.CreateString("test@asd.dg");
auto password = builder.CreateString("test");
auto loginRequest = Vibranium::CreateLoginRequest(builder,email,password);
builder.FinishSizePrefixed(loginRequest);
size_t size = builder.GetSize();
uint8_t *buf = builder.GetBufferPointer();
//And here I am sending it with Boost ASIO.
boost::asio::write(s, boost::asio::buffer(buf,size));
我想做的是獲得這個枚舉的值:
enum ServerOpcode : uint16_t{
SMSG_AUTH_CONNECTION_RESPONSE = 0x001,
SMSG_LOGIN_REQUEST = 0x002,
SMSG_LOGIN_REQUEST_RESPONSE_TEST = 0xA99,
};
讓我們這樣說:
ServerOpcode opc;
opc = ServerOpcode::SMSG_LOGIN_REQUEST;
並在buf*
前面加上opc
。
由於uint16_t
是固定大小而不是接收端,我會知道ServerOpcdode
始終保留在前兩個字節中。
那么我怎樣才能在buf
opc
infron 前面加上它是否有可能以及如何呢?
PS 注意file_indetifier
的 file_indetifier 不是這里的解決方案。
您可以分配一個中間緩沖區。
flatbuffers::FlatBufferBuilder builder;
auto email = builder.CreateString("test@asd.dg");
auto password = builder.CreateString("test");
auto loginRequest = Vibranium::CreateLoginRequest(builder,email,password);
builder.FinishSizePrefixed(loginRequest);
size_t size = builder.GetSize();
uint8_t *buf = builder.GetBufferPointer();
uint8_t *actualBuffer = new uint8_t[size + 2];
actualBuffer[1] = (code >> 8);
actualBuffer[0] = (code&0xFF);
memcpy(actualBuffer + 2, buf, size);
//And here I am sending it with Boost ASIO.
boost::asio::write(s, boost::asio::buffer(actualBuffer, size + 2));
delete[] actualBuffer;
我選擇將 uint16_t 代碼編碼為 Big Endian,這對於我熟悉的任何類型的網絡通信都是很好的形式,但是您當然也可以只執行memcpy(actualBuffer, &code, 2);
,冒着不知道字節序的風險。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.