2017-11-25 788 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

我會嘗試你的建議,並讓你很快知道結果。非常感謝你。 –