我正在使用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;
}
答案 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必须重新计算整个邮件的大小,因为它不知道你是否已经改变它。