Α协议缓冲区初学者。
我有一个C ++应用程序可以通过返回 char *
的方法调用访问二进制数据。
我想将这些数据放到{{ 1}},使用协议缓冲区序列化它们,使用buffer
通过网络发送它们,并从Java应用程序接收和解析它们。
这是我到目前为止所得到的:
ZeroMQ
// 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);
package messaging;
message RequestMessage {
required string description = 1;
optional bytes value = 2;
}
这是正确的吗?
虽然二进制数据大小是37062字节,但是// 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());
只报告4个字节,所以我想协议缓冲区处理msg->ByteSize()
作为char*
数组,并在找到string
后立即停止。
我应该使用什么?
答案 0 :(得分:0)
msg->set_value(buffer);
在这里,你没有给protobuf任何方式来了解buffer
有多大。您只是将指针传递给缓冲区的开头。因此protobuf假设您正在使用传递字符串的C约定,该字符串以第一个NUL字节结束。
为了告诉protobuf缓冲区有多大,你还必须传递大小:
msg->set_value(buffer, buf->Size());
(我只是猜测buf
有Size()
方法;你必须查看文档中的任何类型。)