![](/img/trans.png)
[英]google protocol buffers - encode in C++, decode in Java - InvalidProtocolBufferException
[英]Google Protocol Buffers - Confused about encode decode base64 char * c string protocol buffer data
我正在使用Google协议缓冲区将消息发送到服务器。 我对如何发送图像与如何接收图像感到困惑。 有关详细信息,请参见下面的代码,但我的问题是:
我是否需要base64_decode从未使用base64编码的返回字符串,因为它是使用char *和size发送的? 也许Google Protocol Buffers可以解决这个问题,但是我在生成的类中找不到任何证据。
这是发送数据的代码。 显然,我正在发送一个无符号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。 我创建了我的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;
}
不,您不需要base64解码。 image
字段在.proto
文件中应该具有类型bytes
,因此您可以在其中输入任意字节而无需编码。
请注意,C ++ std::string
允许包含任意字节,而不仅仅是文本。 只要确保您使用image.size()
和image.data()
来访问内容即可。 请勿将image.c_str()
用作文本字符串,并且绝对不要在图像数据上使用strlen()
或任何其他C字符串函数。
也:
int size = message.ByteSize();
您可以删除此行,而只需使用out.size()
。 如果调用ByteSize()
,则protobufs必须重新计算整个消息的大小,因为它不知道您是否已更改它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.