gpt4 book ai didi

python - 使用 SerializeToString() 和 ParseFromString() 函数将 Python ProtoBuf 转换为 C++ ProtoBuf

转载 作者:行者123 更新时间:2023-11-28 05:03:21 25 4
gpt4 key购买 nike

您好,我有一个简单的 addressbook.proto 示例,我在 python 中使用 protobuf SerailizeToString() 函数进行序列化。这是代码。

import address_pb2

person = address_pb2.Person()
person.id = 1234
person.name = "John Doe"
person.email = "jdoe@example.com"
phone = person.phones.add()
phone.number = "555-4321"
phone.type = address_pb2.Person.HOME

print(person.SerializeToString())

address_pb2 是我从 protobuf 编译器生成的文件。请注意,该示例是从 protoBuf 教程中复制的。这给了我以下字符串。

b'\n\x08John Doe\x10\xd2\t\x1a\x10jdoe@example.com"\x0c\n\x08555-4321\x10\x01'

现在我想将这个字符串导入到 C++ protobuf 中。为此,我编写了以下代码。

#include <iostream>
#include <fstream>
#include <string>
#include "address.pb.h"
using namespace std;

int main(int argc, char* argv[]) {
GOOGLE_PROTOBUF_VERIFY_VERSION;


tutorial::AddressBook address_book;
string data = "\n\x08""John Doe\x10""\xd2""\t\x1a""\x10""jdoe@example.com\"\x0c""\n\x08""555-4321\x10""\x01""";
if(address_book.ParseFromString(data)){
cout<<"working"<< endl;
}
else{
cout<<"not working" << endl;
}


// Optional: Delete all global objects allocated by libprotobuf.
google::protobuf::ShutdownProtobufLibrary();

return 0;
}

在这里,我只是尝试使用 ParseFromString() 函数导入脚本,但这行不通,而且我不确定它会如何工作,因为我已经坚持了很长时间是时候了。

我尝试稍微更改二进制文件以适应 C++ 版本,但仍然不知道我是否走在正确的道路上。

我怎样才能做到这一点?有人知道吗?

最佳答案

在 Python 中,您正在序列化一个 Person 对象。在 C++ 中,您正在尝试解析 AddressBook 对象。您需要在两端使用相同的类型。

(请注意,protobuf 不保证它会检测到这些错误。有时,当您将消息解析为错误类型时,解析似乎成功,但内容将是垃圾。)


您的代码还有另一个问题,在这种特定情况下恰好不是问题,但通常不会起作用:

string data = "\n\x08""John Doe\x10""\xd2""\t\x1a""\x10""jdoe@example.com\"\x0c""\n\x08""555-4321\x10""\x01""";

如果字符串有任何 NUL 字节,即 '\x00',这一行将不起作用。如果是这样,该字节将被解释为字符串的结尾。为避免此问题,您需要指定数据的长度,例如:

string data("\n\x08""John Doe\x10""\xd2""\t\x1a""\x10""jdoe@example.com\"\x0c""\n\x08""555-4321\x10""\x01""", 45);

关于python - 使用 SerializeToString() 和 ParseFromString() 函数将 Python ProtoBuf 转换为 C++ ProtoBuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45403854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com