2016-02-29 5 views
0

Α протокол буферов начинающий здесь.Как обменять двоичные данные между C++ и java с использованием буферов протоколов и 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; 
} 

ява сторона

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

Исправлен буфер typo – charis

ответ

0
msg->set_value(buffer); 

Здесь вы не даете protobuf любым способом узнать, насколько велика buffer. Вы передаете ему только указатель на начало буфера. Поэтому protobuf предполагает, что вы используете соглашение C о передаче строки, которая заканчивается в первом байте NUL.

Для того, чтобы сказать Protobuf, как большой буфер, вы должны также пройти как размер:

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

(я только предполагаю, что buf имеет метод Size(), вы должны проверить документацию для любого типа это.)