Forum: PC-Programmierung C++ Deserialize char array basierend auf Beschreibungsdatei


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dirk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte gerne ein char array anhand einer Beschreibungsdatei zur 
Laufzeit in ein JsonObject oder Key valuepair wandeln.

In der ersten Applikation hab ich ein Struct mit allen Werten erstellt 
und mit reinterpret_cast gewandelt, danach ein JsonObject erstellt
struct MyData
{
  uint8_t Test0;
  uint8_t Test1;
  uint16_t Test2
}

 Mydata* data = reinterpret_cast<Mydata*>(bytes);

Es funktioniert, aber ich muss bei Änderungen jedesmal das Struct 
anpassen und die Applikation neu kompilieren.

Jetzt war mein Lösungsansatz eine Funktion zuschreiben, welche anhand 
der Typenbezeichnung in der Beschreibungsdatei die Wandlung vornimmt.

Pseudocode:
static auto ConvertbasedonString(char *type, char* buffer)
{
   if(type == "uint8_t")
     return reinterpret_cast<char>(buffer)
   else if(type == "uint16_t") 
     return reinterpret_cast<uint16_t>(buffer)
}
Beschreibungsdatei:

Name: Test0
type: uint8_t
pos=0
size=1

Name: Test1
type: uint8_t
pos=1
size=1

Name: Test2
type: uint16_t
pos=2
size=2
Wie kann ich in einer C++ Funktion unterschiedliche primitive Typen 
zurückgeben oder gibt es für meine Idee einen anderen Lösungsansatz?

von Dirk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Keiner ein Tipp oder ein kleinen schubster in die richtige Richtung für 
mich?

von xyz (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Bytearray oder void pointer.

Normalerweise wäre der Ansatz aber anhand der description den 
serialize/deserialize code automatisch zu generieren

von mh (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das was du suchst ist vermutlich std::variant. Aber das was du wirklich 
suchst ist vermutlich eine vernünftige json Bibliothek wie 
https://github.com/nlohmann/json

von Dirk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Normalerweise wäre der Ansatz aber anhand der description den
>serialize/deserialize code automatisch zu generieren

Z.b. mit IDL, aber dann müsste der Code immer noch kompiliert werden 
oder?

von abc (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dirk schrieb:
>>Normalerweise wäre der Ansatz aber anhand der description den
>>serialize/deserialize code automatisch zu generieren
>
> Z.b. mit IDL, aber dann müsste der Code immer noch kompiliert werden
> oder?

Ja man hat eine Beschreibungsdatei in der drinsteht: Das sind die Daten.
Daraus wird C++ Code generiert der das Struct beinhaltet, und 
serialize/deserialize Funktione dafür.

Ansätze dafür gibt es ziemlich viele, simpel ist das alles aber nicht.
Was man machen kann ist in deinem Fall:

1. Beschreibungsdatei Parsen,
2. Bytebuffer mit notwendiger Länge anlegen und die Offsets Anhang der 
einzelnen Datentypen merken
3. Daten anhand dessen in den Bytebuffer schreiben oder per memcopy das 
struct reinschreiben (achtung padding)
4. Bytebuffer mit den Metadaten von 1./2. wieder in Datei schreiben

Was du willst ist aber eine ordentliche JSON Library dafür.

Ansonsten:
1. Wenn du schon c++ schreibst dann nimm doch std::string statt char*
2. sicher dass du einen reinterpret cast dort verwenden willst. Das 
mapped 1:1 die bits im speicher zu einem anderen Datentyp

von Programmierer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
xyz schrieb:
> Bytearray oder void pointer.

Bloß nicht, solche Krücken brauch man nur in C.

Dirk schrieb:
> Es funktioniert

ist aber falsch, siehe Serialisierung.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.