rot*_*tor 8 c++ java embedded protocol-buffers
我在一个小型系统上使用protobuf-embedded-c将不同的数据从它传输到PC.问题是,如果我在两端都使用嵌入式库,一切正常.如果我在PC上使用谷歌C++它不再工作.我想我将问题追溯到每个消息中都有长度前缀的嵌入式库,但我似乎无法在C++库中以良好的方式做到这一点.这是我用来调试它的测试应用程序:
person.proto:
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required float number = 1;
required PhoneType type = 2;
}
Run Code Online (Sandbox Code Playgroud)
main.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;
}
Run Code Online (Sandbox Code Playgroud)
真正的问题:Google protobuf C++/Java库应该使用哪些方法与嵌入式库成功通信?简单的答案可能是在所有消息中添加(解析时读取)前缀,但这会破坏代码.我应该寻找更好的嵌入式库吗?
更新:我尝试了这个名为nanopb的小型库,它现在很有用.底线:protobuf-embedded-c与谷歌protobuf实现不兼容!
在protobuf-embedded-c生成的C文件中,存在
int $name$_read(void *_buffer, $if(empty)$$else$struct $name$ *_$name$, $endif$int offset, int limit);
int $name$_write($if(empty)$$else$struct $name$ *_$name$, $endif$void *_buffer, int offset);
Run Code Online (Sandbox Code Playgroud)
它似乎执行了预期的操作,读取/写入没有大小前缀的消息。我不知道为什么这些没有在生成的 H 文件中公开,但您应该可以自己添加。
归档时间: |
|
查看次数: |
3174 次 |
最近记录: |