gpt4 book ai didi

c++ - 在 protobuf 中处理可选消息的正确方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 14:16:23 24 4
gpt4 key购买 nike

考虑以下实现:

人.proto:

    enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}

message PhoneNumber {
required float number = 1;
required PhoneType type = 2;
}

message Person {
required string name = 1;
optional PhoneNumber number = 2;
}

主要.cpp:

#include <stdint.h>
#include <stdio.h>

#include "person.pb.h"

#include <iostream>

int main(int argc, char *argv[])
{
static const uint32_t outputbuflen = 1024;
uint8_t outputbuffer[outputbuflen];
uint32_t writtenlenght = 0;

// Encode a person and send it over any datalink.

// SENDER
Person p_sender;
p_sender.set_name("FooBar");

// Set the phonenumber.
// Does not work because returns const ref.
// p.number().set_number(0123123);

// Is this correct?
PhoneNumber * number = p_sender.mutable_number();
number->set_number(0800123123.0);
number->set_type(MOBILE);

p_sender.SerializeToArray(outputbuffer, outputbuflen);
writtenlenght = p_sender.ByteSize();

std::cout << writtenlenght << "B written to output."<< std::endl;

// Great, now send the stream somwhere
// sendStream(...);

// RECEIVER
// Does not know how many bytes to expect, so we'll let protobuf handle that.
// Simulate a reception loop.
Person p_receiver;
uint32_t bytesparsed;
for(bytesparsed = 0; bytesparsed < writtenlenght; bytesparsed++){
// Look at the data as if receiving it byte by byte.
std::cout << "Trying to parse message " << bytesparsed << std::endl;
if(p_receiver.ParseFromArray(outputbuffer, bytesparsed)){
std::cout << "Found message" << std::endl;;
break;
}
}

std::cout << "Needed " << bytesparsed << "B to read message, but has still " \
<< writtenlenght - bytesparsed << "B left in buffer" << std::endl;
return 0;
}

使用:https://developers.google.com/protocol-buffers/在现实世界的情况下,接收者不知道应该接收的字节数,但 protobuf 应该(据我所知)能够检查缓冲区中的完整消息。如果没有可选消息,这似乎工作正常。目前这并没有发生,我最终得到了一个没有电话号码的 splinter 的人。 :) 我做错了什么,应该如何处理这种情况?

最佳答案

Protocol Buffers 序列化格式不包括框架(即将序列化消息打包到流或定界消息)。你需要自己做。

但是,有一些既定的做法。检查这两个答案的详细信息:

关于c++ - 在 protobuf 中处理可选消息的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10871929/

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