如何在c++;和java使用协议缓冲区和ZeroMQ

如何在c++;和java使用协议缓冲区和ZeroMQ,java,c++,protocol-buffers,zeromq,binary-data,Java,C++,Protocol Buffers,Zeromq,Binary Data,Α这里是初学者 我有一个C++应用程序,它通过一个方法调用访问二进制数据,返回的是“强> >代码> chAR* .BR>我想把这些数据放在缓冲区,使用协议缓冲区将它们序列化,使用ZeroMQ通过网络发送它们,并从Java应用程序接收和解析它们 这就是我到目前为止的想法: C++侧 .proto文件 java端 这是正确的吗?虽然二进制数据大小是37062字节,但是msg->ByteSize()只报告4字节,所以我猜协议缓冲区将字符*视为字符串数组,并在找到\0后立即停止。我应该使用什么来代替

Α这里是初学者

我有一个C++应用程序,它通过一个方法调用访问二进制数据,返回的是“强> >代码> chAR*<代码> <强> .BR>我想把这些数据放在<代码>缓冲区,
使用协议缓冲区将它们序列化,
使用

ZeroMQ
通过网络发送它们,并从Java应用程序接收和解析它们

这就是我到目前为止的想法:

C++侧 .proto文件 java端 这是正确的吗?

虽然二进制数据大小是37062字节,但是
msg->ByteSize()
只报告4字节,所以我猜协议缓冲区将
字符*
视为
字符串
数组,并在找到
\0
后立即停止。

我应该使用什么来代替

msg->set_value(buffer);
在这里,您没有给protobuf任何方法来知道
缓冲区有多大。您只向它传递一个指向缓冲区开头的指针。因此protobuf假设您使用的是传递以第一个NUL字节结尾的字符串的C约定

为了告诉protobuf缓冲区有多大,还必须传递为大小:

msg->set_value(buffer, buf->Size());

(我只是猜测
buf
有一个
Size()
方法;您必须检查文档中的任何类型。)

我建议您试试。这不是原始代码,由于
buffer
声明了两次,所以它无法编译…更正了缓冲区键入错误有一个set_值,它使用第二个size参数,它工作吗?我认为当前的行为是合乎逻辑的,因为protobuf无法在没有明确告诉它的情况下知道数组有多大。
// Receive data to byte[] array
byte[] request;

// Deserialize data
Request.RequestMessage msg = Request.RequestMessage.parseFrom(request);
byte[] test = msg.getValue().toByteArray();

System.out.println("Size of bytestring value " + msg.getValue().size());

process(msg.getDescription(), msg.getValue().toByteArray());
msg->set_value(buffer);
msg->set_value(buffer, buf->Size());