邮件反序列化期间python中的Protobuf抱怨'意外的最终组标记。'

问题描述 投票:0回答:2

我正在开发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 c++ protocol-buffers zeromq
2个回答
1
投票

我在反序列化python中的probbuff数据时也遇到了问题。原型数据已使用'C'原型代码进行了序列化。

简短的答案是使用binascii.unhexlify()。


0
投票

最后,我发现了错误代码。我在C ++服务器的这一行中有一个错误:

© www.soinside.com 2019 - 2024. All rights reserved.