【问题标题】:C++ How to prefix uint16_t in front of uint8_t *bufferC++如何在uint8_t *buffer前面加上uint16_t前缀
【发布时间】:2020-10-20 09:11:32
【问题描述】:

这是我如何使用 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 是否有可能以及如何?

附: 注意,FlatBuffers 的file_indetifier 不是这里的解决方案。

【问题讨论】:

    标签: c++


    【解决方案1】:

    您可以分配一个中间缓冲区。

    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);,但有不知道的风险字节序。

    【讨论】:

    • 谢谢。 FlatBuffers 的编码是 little-endian。你能调整一下答案吗?
    • 我猜你的意思是这样,那么?
    • 我不确定它是否有效。你能检查一下这个问题吗? stackoverflow.com/questions/64442518/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    相关资源
    最近更新 更多