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

Posted

技术标签:

【中文标题】Google Protocol Buffers - 对编码解码 base64 char * c 字符串协议缓冲区数据感到困惑【英文标题】:Google Protocol Buffers - Confused about encode decode base64 char * c string protocol buffer data 【发布时间】:2014-07-23 15:36:34 【问题描述】:

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

我是否需要对从未经过 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 Protocol Buffer 消息并对其进行解析以从中获取信息。在这里,我的图像是一个字符串。

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】:

不,您不需要 base64 解码。 image 字段在 .proto 文件中的类型应为 bytes,因此您可以在其中放入任意字节而无需编码。

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

还有:

 int size = message.ByteSize();

您可以删除此行并使用out.size() 代替。如果你调用ByteSize(),protobufs 必须重新计算整个消息的大小,因为它不知道你是否改变了它。

【讨论】:

以上是关于Google Protocol Buffers - 对编码解码 base64 char * c 字符串协议缓冲区数据感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

Google Protocol Buffers 入门

一文整理:Google Big table 序列化组件 Protocol Buffers 的使用

ReadRawVarint32() 的问题 - Google Protocol Buffers csharp-port

Protocol Buffers教程

DELPHIFLASHAS3FLEX使用Protobuf(google Protocol Buffers)的具体方法

Protocol buffers编写风格指南