gpt4 book ai didi

java - 如何将数据从 protobuf-embedded-c 传输到 Google protobuf C++/Java 库?

转载 作者:可可西里 更新时间:2023-11-01 17:58:51 25 4
gpt4 key购买 nike

我正在使用 protobuf-embedded-c在小型系统上将不同的数据从它传输到 PC。问题是,如果我在两端都使用嵌入式库,一切正常。如果我在 PC 上使用谷歌 C++,它就不再工作了。我想我将问题追溯到每条消息中都有长度前缀的嵌入式库,但我似乎无法在 C++ 库上以一种好的方式做到这一点。这是我用来调试它的测试应用程序:

人.proto:

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

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

主要.cpp:

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

#define __PROTOBUF_CPP_IMPL

#ifdef __PROTOBUF_CPP_IMPL
#include "person.pb.h"
#else
extern "C"{
#include "person.h"
}
#endif

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

#ifdef __PROTOBUF_CPP_IMPL

// C++ implementation.
printf("Google C++ implementation;\n");
PhoneNumber number;
number.set_number(0800123123.0);
number.set_type(MOBILE);

writtenlenght = number.ByteSize();
numberSerializeToArray(outputbuffer, writtenlenght);

#else

// Embedded c implementation.
printf("embedded-c implementation:\n");
PhoneNumber number;
number._number = 0800123123.0;
number._type = _MOBILE;

writtenlenght = PhoneNumber_write_delimited_to(&number, outputbuffer, 0);

#endif

for(uint32_t i = 0; i < writtenlenght; i++){
printf("%.2X ", outputbuffer[i]);
}
printf("\n");
return 0;
}

真正的问题:Google protobuf C++/Java 库中应该使用哪些方法才能与嵌入式库成功通信?简单的答案可能是为所有消息添加(解析时读取)前缀,但这会破坏代码。我应该只寻找更好的嵌入式库吗?

更新:我试用了这个名为 nanopb 的很棒的小库,它目前运行良好。底线:protobuf-embedded-c 与 google protobuf 实现不兼容!

Protobuf comparision.

最佳答案

将偏移量设为 -1 而不是 0。例如:

writtenlenght = PhoneNumber_write_delimited_to(&number, outputbuffer, -1);

或者你可以只使用 PhoneNumber_write(&number, outputbuffer, 0);

关于java - 如何将数据从 protobuf-embedded-c 传输到 Google protobuf C++/Java 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10774875/

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