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

时间:2012-05-27 14:55:49

标签: java c++ 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;
}

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;
}

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

更新:我尝试了这个名为nanopb的小型库,它现在很有用。 底线:protobuf-embedded-c与谷歌protobuf实现不兼容!

Protobuf comparision.

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

在protobuf-embedded-c的generated C file中,存在

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);

似乎做了预期的,读/写没有大小前缀的消息。我不知道为什么这些没有在generated H file中公开,但你应该能够自己添加它。