我正在开发zmq / protobuf应用程序,并且对从C ++发送到python的消息进行反序列化时遇到问题。我很容易处理从python到C ++的消息,但是从另一个方向来看,我遇到了问题。
python客户端应用程序中的Protobuf库抱怨它检测到:File“ C:\ Python27 \ lib \ site-packages \ google \ protobuf \ internal \ python_message.py”,行844,在MergeFromString中引发message_mod.DecodeError('意外的最终组标记。']
我认为C ++序列化和python反序列化之间存在问题。我想知道C / C ++中的空终止符是否存在问题。
我正在将运行Raspian的RaspberryPi用于C ++代码,将运行Windows 7的x64 CPU用于python代码。
这是我的C ++序列化代码。
// Test Code. // Try to send some 'demo' response back. RPiProtocol::Message response; std::string response_string; response.set_type(RPiProtocol::Message::RESPONSE); response.set_command(RPiProtocol::Message::GET_SYS_INFO); response.set_version(0); // Serialize ZMQ message to string. if (response.SerializeToString(&response_string)) { // Send response message back to the client. zmq::message_t reply(response_string.length()); memcpy((void *)reply.data(), (void *)&response_string, response_string.length()); socket.send(reply); }
这是我的python反序列化代码。
# Get the reply. message = socket.recv() response = rpi_protocol_pb2.Message() # This line fails. response.ParseFromString(str(message))
我调试此功能中的反序列化失败\ google \ protobuf \ internal \ python_message.py
def InternalParse(self, buffer, pos, end): self._Modified() field_dict = self._fields unknown_field_list = self._unknown_fields while pos != end: (tag_bytes, new_pos) = local_ReadTag(buffer, pos) field_decoder, field_desc = decoders_by_tag.get(tag_bytes, (None, None)) if field_decoder is None: value_start_pos = new_pos new_pos = local_SkipField(buffer, new_pos, end, tag_bytes) if new_pos == -1: # HERE I HAVE -1 !!! return pos if not unknown_field_list: unknown_field_list = self._unknown_fields = [] unknown_field_list.append((tag_bytes, buffer[value_start_pos:new_pos])) pos = new_pos else: pos = field_decoder(buffer, new_pos, end, self, field_dict) if field_desc: self._UpdateOneofState(field_desc) return pos cls._InternalParse = InternalParse
您能帮我启用我的应用程序吗?
我正在开发zmq / protobuf应用程序,并且对从C ++发送到python的消息进行反序列化时遇到问题。我很容易处理从python到C ++的消息,但是从另一个方向来看,我有...
我在反序列化python中的probbuff数据时也遇到了问题。原型数据已使用'C'原型代码进行了序列化。
简短的答案是使用binascii.unhexlify()。
最后,我发现了错误代码。我在C ++服务器的这一行中有一个错误: