在消息反序列化期间,python中的Protobuf抱怨'Unexpected end-group tag.'
Protobuf in python during message deserialization complains about 'Unexpected end-group tag.'
我正在开发zmq/protobuf应用程序,我有一个从c++发送到python的反序列化消息的问题。我很容易处理从python到c++的消息,但在另一个方向我有一个问题。
python客户端程序中的Protobuf库报错检测到:
文件"C:Python27libsite-packagesgoogleprotobufinternalpython_message.py",第844行,在MergeFromString提高message_mod。DecodeError(' end-group tag.')
我认为c++序列化和python反序列化之间存在问题。我想知道C/c++中null终止符是否有问题。
我使用RaspberryPi运行Raspian的c++代码和x64 CPU运行Windows 7的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))
我在这个函数中调试了反序列化失败googleprotobufinternalpython_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
你能帮我启用我的应用程序吗?
我也遇到过用python反序列化protobuff数据的问题。使用'C' protobuff代码序列化了protobuff数据。
简单的答案是使用binascii.unhexlify()。
在python上序列化一个protobuff,然后发送给C代码,在那里它被反序列化工作得很好。但相反的情况是不正确的,直到我做了以下操作:binstring = binascii.unhexlify(hexstring)。然后protobuffs . parsefromstring (binstring)工作得很好
最后我找到了有bug的代码。我在c++服务器的这一行有一个错误:
memcpy((void *)reply.data(), (void *)&response_string, response_string.length());
应该是:
memcpy((void *)reply.data(), (void *)response_string.data(), response_string.length());
我了解如何将c++字符串转换为ZMQ字符串,因为我在网上找到了这个函数:
// Convert string to 0MQ string and send to socket
static bool s_send (zmq::socket_t & socket, const std::string & string) {
zmq::message_t message(string.size());
memcpy (message.data(), string.data(), string.size());
bool rc = socket.send (message);
return (rc);
}
下面是指向zhelpers.hpp头文件的链接,其中包含上面粘贴的函数和许多其他基于c++ ZMQ的应用程序的有用函数:https://github.com/imatix/zguide/blob/master/examples/C%2B%2B/zhelpers.hpp
- 静态代码检查器抱怨.虚惊一场?
- 野牛/yacc 解析器在不被空格分隔时跳过 grammer - "unexpected $end"
- 为什么 g++ 10.1 抱怨头文件中的命名 lambda,而其他人则没有?
- 在 armhf 上使用 cmake 在 qt 上的编译问题 "Syntax error: wird unexpected (expecting " ) " "
- 为什么编译器在使用"无常量复制构造函数"时抱怨?
- 使用 GraphicsPath::AddString() 抱怨"class 'GraphicsPath' has no member 'AddString'"
- 为什么编译器抱怨 std::thread 参数在转换为右值后必须是可调用的?
- 接收"Error compiling: 0:1(1): error: syntax error, unexpected $end" C++、GLSL、着色器文件
- C++编译器抱怨没有默认构造函数
- cppcheck 抱怨危险地使用 c_str(). c_str() 返回的值在此调用后无效
- cpp 检查抱怨危险使用 c_str(). c_str() 返回的值在本次调用后无效,如何解决?
- 当我尝试进行TPC-E测试时,实用程序抱怨"undefined reference"
- 曾与notify_all_at_thread_exit抱怨
- 尝试在类中编译内核,出现错误"__init__() got an unexpected keyword argument 'kernel'"
- 使用变换翻转地图,接收错误"type int unexpected"
- 为什么当我不移动任何东西时,clang 会抱怨删除移动 ctor?
- PVS-Studio抱怨浮点比较
- 为什么这段代码抱怨"a non-type template parameter cannot have type"?
- 为什么海湾合作委员会抱怨"declaration of 'foo' shadows a previous call [-Werror=shadow]"
- 在消息反序列化期间,python中的Protobuf抱怨'Unexpected end-group tag.'