如何通过 python protobuf 解析 C++ protobuf 二进制数据?
How to parse C++ protobuf binary data by python protobuf?
我使用 C++ protobuf 将数据序列化为字符串。
/***** cpp code *****/
string serialized_data;
message_cpp.SerializeToString(&serialized_data);
问题:我可以解析python中的serialized_data
吗?以及如何?
我试过下面的代码,但是没有用。
##### python code
message_python = foo.ParseFromString(serialized_data)
print message_python
但我得到 None
作为 print message_python
的输出。我也试过
##### python code
message_python = foo.MergeFromString(serialized_data)
print message_python
但是我得到字符串 serialized_data
的长度作为 print message_python
的输出,即 message_python == len(serialized_data)
。此结果与 python protobuf API.
一致
这是否意味着我无法解析在 C++ 中序列化的 python 中的二进制数据?
更新:
我的目标:C++服务器总是生成图像流并将图像发送到python服务器。
这是我的全部代码:
.proto 文件:
message MyImage{
repeated int32 width = 1;
repeated int32 height = 2;
repeated bytes image = 3;
}
C++ 服务器:
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://localhost:5555");
MyImage message_cpp;
// message_cpp.add_image(), add_width() and add_height() here.
string serialized_data;
message_cpp.SerializeToString(&serialized_data);
int counter = 3;
while (counter > 0) {
zmq::message_t request;
socket.recv(&request);
std::string replyMessage = std::string(static_cast<char *>(request.data()),
request.size());
std::cout << "Recived from client: " + replyMessage << std::endl;
sleep(1);
zmq::message_t reply(serialized_data.size());
memcpy((void*) reply.data(), serialized_data.data(), serialized_data.size());
std::cout << "---length of message to client: " <<
reply.size() << std::endl;
socket.send(reply);
counter --;
}
python 客户:
context = zmq.Context()
socket = context.socket(zmq.REQ)
port = "5555"
socket.connect("tcp://localhost:%s" %port)
print "Connecting to server..."
foo = my_image_pb2.MyImage()
for i in range(3):
socket.send("hello from python")
serialized_data = socket.recv()
message_python = foo.ParseFromString(serialized_data)
print "length of message from server:", len(serialized_data),"; type:", type(message)
print "-----", message_python
这是结果:
服务器:
客户:
为什么 foo
是 None
,而不是 class?知道如何解决吗?
ParseFromString
将 解析为 它所调用的对象。它没有 return 任何东西。像这样使用它:
message = MyMessage()
message.ParseFromString(data)
print message
我使用 C++ protobuf 将数据序列化为字符串。
/***** cpp code *****/
string serialized_data;
message_cpp.SerializeToString(&serialized_data);
问题:我可以解析python中的serialized_data
吗?以及如何?
我试过下面的代码,但是没有用。
##### python code
message_python = foo.ParseFromString(serialized_data)
print message_python
但我得到 None
作为 print message_python
的输出。我也试过
##### python code
message_python = foo.MergeFromString(serialized_data)
print message_python
但是我得到字符串 serialized_data
的长度作为 print message_python
的输出,即 message_python == len(serialized_data)
。此结果与 python protobuf API.
这是否意味着我无法解析在 C++ 中序列化的 python 中的二进制数据?
更新:
我的目标:C++服务器总是生成图像流并将图像发送到python服务器。
这是我的全部代码:
.proto 文件:
message MyImage{
repeated int32 width = 1;
repeated int32 height = 2;
repeated bytes image = 3;
}
C++ 服务器:
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://localhost:5555");
MyImage message_cpp;
// message_cpp.add_image(), add_width() and add_height() here.
string serialized_data;
message_cpp.SerializeToString(&serialized_data);
int counter = 3;
while (counter > 0) {
zmq::message_t request;
socket.recv(&request);
std::string replyMessage = std::string(static_cast<char *>(request.data()),
request.size());
std::cout << "Recived from client: " + replyMessage << std::endl;
sleep(1);
zmq::message_t reply(serialized_data.size());
memcpy((void*) reply.data(), serialized_data.data(), serialized_data.size());
std::cout << "---length of message to client: " <<
reply.size() << std::endl;
socket.send(reply);
counter --;
}
python 客户:
context = zmq.Context()
socket = context.socket(zmq.REQ)
port = "5555"
socket.connect("tcp://localhost:%s" %port)
print "Connecting to server..."
foo = my_image_pb2.MyImage()
for i in range(3):
socket.send("hello from python")
serialized_data = socket.recv()
message_python = foo.ParseFromString(serialized_data)
print "length of message from server:", len(serialized_data),"; type:", type(message)
print "-----", message_python
这是结果:
服务器:
客户:
为什么 foo
是 None
,而不是 class?知道如何解决吗?
ParseFromString
将 解析为 它所调用的对象。它没有 return 任何东西。像这样使用它:
message = MyMessage()
message.ParseFromString(data)
print message