2016-02-29 119 views
0

A協議緩衝區初學者在這裏。如何使用協議緩衝區和ZeroMQ在C++和java之間交換二進制數據

我有具有經由返回char *方法調用訪問二進制數據C++應用程序。
我想將這些數據片段放到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個字節,所以我猜想協議緩衝區將char*視爲string數組,並在找到\0後立即停止。

我應該用什麼來代替?

+0

我建議你試試看。 –

+0

這不是原始代碼,它不能編譯,因爲'buffer'被聲明瞭兩次... – norisknofun

+0

更正了緩衝區輸入錯誤 – charis

回答

0
msg->set_value(buffer); 

在這裏,你沒有給protobuf任何方式來知道有多大buffer是。你只傳遞一個指向緩衝區開始的指針。因此,protobuf假定您使用傳遞字符串的C約定,該字符串以第一個NUL字節結束。

爲了告訴protobuf的緩衝區有多大,你也必須經由大小:

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

(我只是猜測,bufSize()方法,你就必須查看文檔無論這是什麼類型)。