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. 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] > <javascript:>> 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] <javascript:>. >> To post to this group, send email to [email protected] >> <javascript:>. >> 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.
