[英]Issue in reading repeated fields from protocol buffers in C++
org.proto
message Optimize {
required int element_size = 1;
required string element_name = 2;
}
message nodes {
repeated Optimize = 1;
}
有這個解碼功能:
DecodeNodeMsg(char *msg, int size)
{
Org::nodes node;
int element_size;
string element_name;
int NumofElem = 0;
node.ParseFromArray((void *)msg, size);
for (int i = 0; i < nodes.Optimize().size(); i++)
{
element_size = nodes.Optimize(i).element_size();
element_name = nodes.Optimize(i).element_name();
cout << "size" << element_size << endl;
cout << "name" << element_name << endl;
NumofElem++;
}
cout << "number of" << NumofElem << endl;
}
我正在編碼節點消息,其中包含三條Optimize消息。 並調用此解碼功能。 編碼部分是一個很久以來工作正常的舊代碼。 所以我不懷疑編碼功能。
在解碼功能中,我看到NumofElem被正確打印為三個。 但是,我看到element_size和element_name都只是垃圾。 整數有一些垃圾值,字符串有二進制數據。
我只有在這個重復的領域才有這個問題。 如果字段是必填/可選字段,那么我沒有這個問題。
有人會有類似的問題......? 如果有任何線索如何解決這個問題?
謝謝,Kiran
我沒有看到你實際解碼消息的位置。 我看到你創建了一個新的節點對象,但隨后調用了看起來錯誤的Org :: nodes()。 我認為你需要像這樣訪問Optimize元素:
for (int i = 0; i < node->optimize_size(); i++)
{
element_size = node->optimize(i).element_size();
element_name = node->optimize(i).element_name();
cout << "size" << element_size << endl;
cout << "name" << element_name << endl;
NumofElem++;
}
但我再次認為你的節點對象需要從某些東西中解碼。 可變方法允許您設置數據。 還有ParseFrom方法。 同樣在我的proto文件中,我對消息中的元素進行編號。 請參閱https://developers.google.com/protocol-buffers/docs/overview
message nodes {
repeated Optimize = 1;
}
該函數將緩沖區反序列化為局部變量節點 ,但循環引用節點 。 我還要驗證ParseFromArray的返回值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.