2017-11-25 55 views
0

我正在接收数据为unsigned char*,它包含一个字节数组。在协议缓冲区中使用Message :: ParseFromIstream感到困惑

unsigned char* byteptr = static_cast<unsigned char*>(msg.data()); 

我想我的初始化协议缓冲区是一个地址簿。我觉得最好的比赛是使用ParseFromIstream是以下几点:

my_address_book.ParseFromIstream() 

关于字节数组,这是unsigned char*。由于字节数组的长度不是在编译时已知,有两种选择:

选项1可变长度数组

unsigned char bytearray[msg.size()]; 
std::copy(byteptr, byteptr + msg.size(), bytearray); 

选项2.动态分配的数组,并删除它进行一次

unsigned char* bytearray = new unsigned char [msg.size()]; 
std::copy(byteptr, byteptr + msg.size(), bytearray); 

我有以下问题:

  1. 如何在情况下使用?
  2. 考虑到更好的性能(快速执行速度)是优先考虑的,哪个选项在上述两者中最好?
+0

'Message'继承自'MessageLite',因此[您也可以使用'MessageLite'函数](https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.message_lite )。检查'ParseFromString',['ParseFromCodedStream','ParseFromZeroCopyStream'或'ParseFromBoundedZeroCopyStream'](https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.coded_stream)并使用最符合你情况的那个。 – Cornstalks

回答

2

您应该使用ParseFromArray(),这需要一个指针和大小:

my_address_book.ParseFromArray(msg.data(), msg.size()) 

没有必要的数据都复制到一个新的数组。

+0

我会尝试你的建议,并让你很快知道结果。非常感谢你。 –