繁体   English   中英

如何使用协议缓冲区和ZeroMQ在C ++和Java之间交换二进制数据

[英]How to exchange binary data between c++ and java using protocol buffers and ZeroMQ

这里是一个协议缓冲区初学者。

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

到目前为止,这是我提出的内容:

C ++方面

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

.proto文件

package messaging;

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

Java端

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

这个对吗?

尽管二进制数据大小为37062字节,
msg->ByteSize()仅报告4个字节,因此我想协议缓冲区msg->ByteSize() char*视为string数组,并在找到\\0立即停止。

我应该怎么用呢?

msg->set_value(buffer);

在这里,您没有给protobuf提供任何方法来知道有多大的buffer 您仅向其传递了指向缓冲区开头的指针。 因此,protobuf假定您正在使用C约定来传递以第一个NUL字节结尾的字符串。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM