簡體   English   中英

從C ++中的協議緩沖區讀取重復字段的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM