Pat*_*cia 2 c c++ string byte protocol-buffers
我正在使用Google Protocol Buffers将消息发送到服务器.我的困惑在于如何发送图像与我如何接收图像.请参阅下面的代码了解详情,但我的问题是:
我是否需要对从未进行过base64编码的返回字符串进行base64_decode,因为它是使用char*和size发送的?也许Google Protocol Buffers处理这个问题,但我在生成的类中找不到任何证据.
这是发送数据的代码.显然,我发送一个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;
}
Run Code Online (Sandbox Code Playgroud)
这是接收数据的代码.从服务器返回,我收到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;
}
Run Code Online (Sandbox Code Playgroud)
不,您不需要base64解码.该image字段应该bytes在您的.proto文件中有类型,因此您可以在其中放置任意字节而无需编码.
请注意,std::string允许C++ 包含任意字节,而不仅仅是文本.只需确保您使用image.size()和image.data()访问内容.不要image.c_str()像文本字符串一样使用,并且绝对不要strlen()在图像数据上使用任何其他C字符串函数.
也:
int size = message.ByteSize();
Run Code Online (Sandbox Code Playgroud)
您可以删除此行,而只是使用out.size().如果你打电话ByteSize(),protobufs必须重新计算整个邮件的大小,因为它不知道你是否已经改变它.
| 归档时间: |
|
| 查看次数: |
2687 次 |
| 最近记录: |