gpt4 book ai didi

c++ - Google Protocol Buffers - 缺少必填字段,即使所有字段显然都存在

转载 作者:可可西里 更新时间:2023-11-01 16:38:52 25 4
gpt4 key购买 nike

我正在尝试通过 TCP 发送 Protocol Buffer 消息,但在接收方尝试解析时出现“缺少必填字段”错误,即使显然所有字段都在那里。我在包含消息长度的消息之前发送一个 4 字节的 header 。

消息定义如下:

message ReplayRequest {
required string channel = 1;
required uint32 start = 2;
required uint32 end = 3;
}

在客户端,我对 header 进行编码并将消息序列化为 vector 。

ReplayRequest req;
req.set_channel( "channel" )
req.set_start( 1 );
req.set_end( 5 );
int byte_size = req.ByteSize();
std::vector<uint8_t> write_buffer( HEADER_SIZE + byte_size );
encode_header( ... );
req.SerializeToArray( &write_buffer[HEADER_SIZE], byte_size );

这是结果缓冲区的十六进制打印,其中前 4 个字节是编码的消息长度(13 个字节)。

00 00 00 0d 0a 07 63 68 61 6e 6e 65 6c 10 01 18 05

在服务器端,我收到 header ,对其进行解码,然后接收 N 个字节,其中 N 是 header 中报告的消息大小。服务器中删除 header 的缓冲区是:

0a 07 63 68 61 6e 6e 65 6c 10 01 18 05

这与一个编码的客户端减去 header 完全相同,但是当我尝试 ParseFromArray 这个缓冲区时,我得到一个错误:

libprotobuf ERROR c:\umdf_runtime\protobuf-2.4.1\src\google\protobuf\message_lit
e.cc:123] Can't parse message of type "ReplayRequest" because it is missing
required fields: channel, start, end

在调试时我注意到解码失败的地方是在 protobuf 生成的代码的这一部分:

bool ReplayRequest::IsInitialized() const {
if ((_has_bits_[0] & 0x00000007) != 0x00000007) return false;

return true;
}

has_bits_ 由于某种原因在服务器端被读取为零,但我不明白为什么。

有什么想法吗?

如果重要的话,我在网络部分使用 boost::asio。

更新

根据要求,我发布了调用 parseFromArray 的代码。

request_.ParseFromArray( &data_buffer_, data_buffer_.size() );

request_ 是一个 ReplayRequest 成员变量,直到这个调用没有对它做任何事情。

data_buffer_ 是一个 vector ,TCP 数据被接收到其中。

我确认它的大小正确,为 13 个字节,这是它的十六进制转储,这与我在序列化后转储缓冲区客户端时得到的相同。

0a 07 63 68 61 6e 6e 65 6c 10 01 18 05

更新 2

我能够在客户端将缓冲区解析为 ReplayRequest 的另一个实例,即:

...snip...
req.SerializeToArray( &write_buffer[HEADER_SIZE], byte_size );
ReplayRequest test;
test.ParseFromArray( &write_buffer[HEADER_SIZE], byte_size );

测试已成功填充正确的字段。

最佳答案

问题是您传递的是指向 vector 的指针,而不是指向 vector 数据的指针。

代替
request_.ParseFromArray( &data_buffer_, data_buffer_.size() );

尝试
request_.ParseFromArray( &data_buffer_[0], data_buffer_.size() );

关于c++ - Google Protocol Buffers - 缺少必填字段,即使所有字段显然都存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13933587/

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