簡體   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