On Thu, May 28, 2015 at 12:02 AM, Jan Kyjovský <[email protected]>
wrote:

> Hi,
>
> yes thank you for that hint. I was able to get enough references to go
> through decoded data. I am more or less efficiently able to get values (in
> case of ENUM also original value not only symbolic meaning) but now I would
> require some auxiliary information which I am not sure are contained in
> these objects. I will need to get access to current byte offset (from data
> start) and size of element.
>
No, it's not possible to get the byte offset with protobuf API. If you need
that, you probably have to write your own parsing method to parse the data.


> Although size is something I can probably somehow derive. Is there any
> possibility to that?
>
> On Thursday, 7 May 2015 19:44:22 UTC+2, Feng Xiao wrote:
>>
>>
>>
>> On Thu, May 7, 2015 at 2:29 AM, Jan Kyjovský <[email protected]> wrote:
>>
>>> Hi,
>>>
>>> sorry for asking for advice so soon again.
>>>
>>> I have progressed a bit futher and I am now trying to display decoded
>>> data. For that purpose I have prepared some data and tried to decode them
>>> but I have encountered problem with repeated structures and with nested
>>> messages. I dont know how to get count of repeats in case of repeated
>>> fields so its problematic to address them. In case of nested messages I
>>> have experiencing difficulties how to get message.
>>>
>>> Here is function I have made so far. Note that I am suspecting that it
>>> will probably need some more tweaking so it can be called recursively (work
>>> still in progress). For now I am satisfied just by displaying data on first
>>> level.
>>>
>>> void ExpandSubMessage(Message *message, Descriptor *descriptor)
>>> {
>>>     for (int i = 0; i < descriptor->field_count(); i++)
>>>     {
>>>         const FieldDescriptor* field = descriptor->field(i);
>>>         switch (field->type())
>>>         {
>>>             case FieldDescriptor::TYPE_INT32:
>>>             {
>>>                 int nVal = message->GetReflection()->GetInt32(*message,
>>> field);
>>>                 printf("%s = %d\n", field->name().c_str(), nVal);
>>>
>>>                 break;
>>>             }
>>>             case FieldDescriptor::TYPE_STRING:
>>>             {
>>>                 std::string strVal =
>>> message->GetReflection()->GetString(*message, field);
>>>                 printf("%s = %s\n", field->name().c_str(),
>>> strVal.c_str());
>>>
>>>                 break;
>>>             }
>>> //            case FieldDescriptor::TYPE_ENUM:
>>> message->GetReflection()->GetEnum(*message, field); break;
>>>             case FieldDescriptor::TYPE_MESSAGE:
>>>             {
>>>                 Message *messVal;
>>>                 if (field->is_repeated())
>>>                 {
>>>
>>> message->GetReflection()->GetRepeatedMessage(*message, field, 1);
>>>                 }
>>>                 else
>>>                 {
>>>                     message->GetReflection()->GetMessage(*messVal,
>>> field);
>>>                 }
>>>                 printf("%s = %s\n", field->name().c_str(),
>>> /*messVal.DebugString().c_str()*/"Test");
>>>
>>>                 break;
>>>             }
>>>         }
>>>     }
>>> }
>>>
>>> I have tried to look for details in specification on your pages but
>>> didn't find anything that would answer my question.
>>>
>>> May I once again ask for your assistance?
>>>
>> What you are trying to do looks similar to what the TextFormat class
>> does. You can refer to that class as an example to learn how to use
>> protobuf reflection to traverse a message tree:
>>
>> https://github.com/google/protobuf/blob/master/src/google/protobuf/text_format.cc#L1449
>>
>>
>>>
>>>  --
>>> You received this message because you are subscribed to the Google
>>> Groups "Protocol Buffers" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at http://groups.google.com/group/protobuf.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>  --
> You received this message because you are subscribed to the Google Groups
> "Protocol Buffers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/protobuf.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to