2017-07-20 2 views
-5

Ich möchte eine odx-f-Datei mit C++ analysieren. Aber ich kann kein einziges Beispiel dafür finden, wie man es analysiert. Ich bin neu auf dieser Seite, können Sie mir bitte helfen, dieses Problem mit Beispielcode zu lösen? Danke im Voraus.Wie odx-f-Datei in cpp zu analysieren

+3

Lesen/lernen Sie die Dateiformatspezifikation und parsen Sie entsprechend. Alle Dateien sind Array von Bytes. Die Formatspezifikation erklärt, was diese Bytes bedeuten. Oder verwenden Sie Bibliotheken von Drittanbietern, die diese Aufgabe für Sie übernehmen. – Ron

+0

ist das odx Datei Parser in cpp verfügbar? – Rajeev

+0

können Sie bitte vorschlagen, eine dritte Partei lib für mich, dies zu tun – Rajeev

Antwort

0

odx-f-Dateien, die die Flash-Containerdaten enthalten. Um eine .odx-f-Datei in C++ zu analysieren, können Sie einen beliebigen XML-Parser verwenden (d. H. rapidxml, xerces, LibXML2 mit C++ Wrapper, ...). Im folgenden Beispiel wird rapidxml zum Drucken der SHORT-NAME aller ECU-MEMS und ECU-MEM-CONNECTORS verwendet. Um auf alle anderen Elemente unter ECU-MEM zuzugreifen, kann der gleiche Mechanismus angepasst werden (hängt davon ab, welche Daten Ihre Anwendung von der .odx-f-Datei benötigt).

#include <iostream> 

#include "rapidxml/rapidxml.hpp" 
#include "rapidxml/rapidxml_utils.hpp" 

int main(int argc, char *argv[]){ 
    rapidxml::xml_document<> doc; 
    rapidxml::file<> xmlFile("myFile.odx-f"); 
    doc.parse<0>(xmlFile.data()); 
    rapidxml::xml_node<>* flashContainer = doc.first_node("ODX")->first_node("FLASH"); 
    if(flashContainer){ 
    std::cout << flashContainer->first_node("SHORT-NAME")->value() << std::endl; /* prints the shortname of the flash container */ 
    for (rapidxml::xml_node<>* ecuMem = flashContainer->first_node("ECU-MEMS")->first_node("ECU-MEM"); ecuMem; ecuMem = ecuMem->next_sibling("ECU-MEM")) { 
     /* iterates over all ecu memory descriptors */ 
     std::cout << ecuMem->first_node("SHORT-NAME")->value() << std::endl; /* prints the shortname of the ecu memory descriptor */ 
    } 
    for (rapidxml::xml_node<>* ecuMemCon = flashContainer->first_node("ECU-MEM-CONNECTORS")->first_node("ECU-MEM-CONNECTOR"); ecuMemCon; ecuMemCon = ecuMemCon->next_sibling("ECU-MEM-CONNECTOR")) { 
     /* iterates over all ecu memory connectors */ 
     std::cout << ecuMemCon->first_node("SHORT-NAME")->value() << std::endl; /* prints the shortname of the ecu memory connector */ 
    } 
    } 
    return 0; 
} 

Es gibt auch einige Bibliotheken zum Parsen von odx; Normalerweise sind sie teuer, da sie auf kommerzielle Nutzung abzielen, aber es gibt eine Bibliothek, die unter LGPLv2 mit dem Namen ODX-Lib lizenziert ist. Es wird jedoch seit 2014 und in Java nicht aktualisiert (JNI benötigt Zugriff von C++).