谷歌协议缓冲区消息到字节数组C ++

时间:2014-08-28 11:35:39

标签: c++ c windows protocol-buffers

我目前正在使用两种邮件协议,一种是google proto,另一种是c-structs。将Google协议缓冲消息(MessageLite)转换为字节数组的最佳解决方案是什么?

例如,我希望转换以下google proto消息:

message GoogleRequest
{
     optional int32 request = 1 [default = 0];
}

为:

struct Request
{
    int request;
};

我尝试过以下操作但不起作用:

GoogleRequest reqMsg;
reqMsg.set_request(1234);

int size = reqMsg.ByteSize();
Request* reqStruct = new Request;
reqMsg.SerializeToArray((void*)reqStruct , size);

任何建议,或者是最好的方式:

reqStruct->request = reqMsg.request();

我有很多消息类型,我会很高兴找到一种通用的方法来实现它。

1 个答案:

答案 0 :(得分:5)

您说要将邮件转换为字节数组,但您的代码建议您尝试将其转换为C结构(Request)。不支持转换为C结构。转换为字节数组(即char的数组)很简单:

int size = reqMsg.ByteSize();
char* array = new char[size];
reqMsg.SerializeToArray(array, size);

或者,另一种方式:

std::string bytes = reqMsg.SerializeAsString();
const char* array = bytes.data();
int size = bytes.size();

但是,此数组不是结构,并且根据内容可能有许多不同的大小。除了编写手动复制每个字段的代码之外,无法转换为结构。