Α протокол буферов начинающий здесь.Как обменять двоичные данные между 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
.
Что следует использовать вместо этого?
Предлагаю вам попробовать. –
Это не оригинальный код, и он не может скомпилировать его с тех пор, как 'buffer' объявлен дважды ... – norisknofun
Исправлен буфер typo – charis