Google Protocol Buffers - 对编码解码base64 char * c字符串协议缓冲区数据感到困惑

时间:2014-07-23 15:36:35

标签: c++ c string byte protocol-buffers

我正在使用Google Protocol Buffers将消息发送到服务器。我的困惑在于我如何发送图像与如何接收图像。有关详细信息,请参阅下面的代码,但我的问题是:

我是否需要对从未进行过base64编码的返回字符串进行base64_decode,因为它是使用char *和size发送的?也许Google Protocol Buffers会处理这个问题,但我无法在生成的类中找到任何证据。

我可能已找到答案here,但我想确定。


以下是发送数据的代码。显然,我发送一个unsigned char *和一个const long unsigned int来设置图像。

std::string message::myMessaging::generateMessage(unsigned char *imageData, const long unsigned int elemSize, long unsigned int *msgSize)
{
    ImageMessage message;
    message.set_ismaster(true);
    message.set_personname("Lucy");
    message.set_image(imageData, elemSize);

    string out;
    message.SerializeToString(&out);
    int size = message.ByteSize();
    memcpy(msgSize, &size, sizeof(int));
    return out;
}

以下是接收数据的代码。从服务器返回,我收到messageData作为const字符串。我创建了我的Google协议缓冲区消息并对其进行解析以从中获取信息。在这里,我的图像是一个字符串。

std::string message::myMessaging::parseMessage(const string messageData, long unsigned int *msgSize)
{
    ImageMessage message;
    message.Clear();
    message.ParseFromString(messageData);

    string personname = message.personname();
    string image = message.image();

    // do I need to decode it ?
    std::string decoded = base64_decode(image);

    // or can I just return the string image ?
    return decoded;
}

1 个答案:

答案 0 :(得分:5)

不,你不需要base64解码。 image字段在bytes文件中应该有.proto类型,因此您可以在不编码的情况下在其中放置任意字节。

请注意,允许C ++ std::string包含任意字节,而不仅仅是文本。只需确保使用image.size()image.data()来访问内容。不要像文本字符串那样使用image.c_str(),并且绝对不要在图像数据上使用strlen()或任何其他C字符串函数。

此外:

 int size = message.ByteSize();

您可以删除此行,只需使用out.size()即可。如果你打电话给ByteSize(),protobufs必须重新计算整个邮件的大小,因为它不知道你是否已经改变它。