簡體   English   中英

C++ 如何在 uint8_t *buffer 前面加上前綴 uint16_t

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

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