如何使用协议缓冲区和ZeroMQ

时间:2016-02-29 10:55:28

标签: java c++ protocol-buffers zeromq binary-data

Α协议缓冲区初学者。

我有一个C ++应用程序可以通过返回 char * 的方法调用访问二进制数据。
我想将这些数据放到{{ 1}},使用协议缓冲区序列化它们,使用buffer通过网络发送它们,并从Java应用程序接收和解析它们。

这是我到目前为止所得到的:

c ++ side

ZeroMQ

.proto文件

// Pointer to the binary data
char *buffer = buf->Buffer();

// Serialize data using protocol buffers
messaging::RequestMessage* msg = new messaging::RequestMessage;
msg->set_description("data");
msg->set_value(buffer);

int size = msg->ByteSize();
char *serialBuffer = malloc(size);
msg->SerializeToArray(serialBuffer, size);

// Send data using ZeroMQ
mq.connect(ss.str());
mq.send((char *)serialBuffer, size);

java方

package messaging;

message RequestMessage {
    required string description = 1;
    optional bytes value = 2;
}

这是正确的吗?

虽然二进制数据大小是37062字节,但是// 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()); 只报告4个字节,所以我想协议缓冲区处理msg->ByteSize()作为char*数组,并在找到string后立即停止。

我应该使用什么?

1 个答案:

答案 0 :(得分:0)

msg->set_value(buffer);

在这里,你没有给protobuf任何方式来了解buffer有多大。您只是将指针传递给缓冲区的开头。因此protobuf假设您正在使用传递字符串的C约定,该字符串以第一个NUL字节结束。

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

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

(我只是猜测bufSize()方法;你必须查看文档中的任何类型。)