当前位置: 首页 > 知识库问答 >
问题:

Google协议缓冲区-混淆编码解码base64 char * c字符串协议缓冲区数据

臧增
2023-03-14

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

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

我可能在这里找到了答案,但我想确定。

这是发送数据的代码。显然,我正在发送一个无符号char*和一个常量long无符号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;
}

这是接收数据的代码。从服务器返回后,我以const字符串的形式接收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;
}

共有1个答案

姬雪松
2023-03-14

不,您不需要 base64 解码。图像字段在 .proto 文件中应具有字节类型,因此无需编码即可在其中放置任意字节。

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

另外:

 int size = message.ByteSize();

您可以删除此行,而只使用 out.size() 。如果调用 ByteSize(),则原型缓冲区必须重新计算整个消息的大小,因为它不知道您是否已更改它。

 类似资料:
  • 问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa

  • 在阅读这个相当长的问题之前,我提出了一个bughttps://github.com/GoogleCloudPlatform/python-docs-samples/issues/1103. 原型包和名称解析的留档状态 您可以使用其他定义。通过导入原始文件。导入另一个。在proto的定义中,您可以在文件的顶部添加一条import语句。 我的依赖于annotations.proto将HTTP/JSON

  • 试图使用Ionic 4中的协议缓冲区进行编码 我已经下载了协议并用它来生成一堆_pb.js文件,每个. proto文件一个。很好。 首先关注原型示例。这是示例代码: 我做了一些更改以匹配我的文件。更改proto文件的名称。但是我的proto文件中没有包名称。所以我只是使用了消息名称。首先这是我的. proto文件的开头: 下面是我修改后的代码: 这似乎不起作用。我的控制台显示: 我相信我已经成功地

  • 我正在使用以下代码 我得到了这个错误,我不明白为什么我得到了它(是的,我得到了三次): libProbuf ERROR google/Probuf/wire_format.cc:1059]在序列化协议缓冲区时遇到包含无效UTF-8数据的字符串。字符串必须仅包含UTF-8;对原始字节使用'bytes'类型。 libProbuf ERROR google/Probuf/wire_format.cc:1

  • 当我尝试编译测试代码时,我收到链接错误。我在windows 7上使用cygwin。初始步骤如./confiure, make, make test 我还能够生成。pb。抄送和。pb。h使用protoc命令。 但当我试图编译测试代码时,它会出现许多链接错误。我确信这些错误是因为它无法链接到库。 Cygwin在/usr/local/lib中有protobuf静态库和链接库。包含文件位于/usr/loc

  • 两者都是序列化库,由谷歌开发人员开发。他们之间有什么大的区别吗?将使用协议缓冲区的代码转换为使用FlatBuffers需要大量工作吗?