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.
