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


von Dirk (Gast)


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
1
struct MyData
2
{
3
  uint8_t Test0;
4
  uint8_t Test1;
5
  uint16_t Test2
6
}
7
8
 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:
1
static auto ConvertbasedonString(char *type, char* buffer)
2
{
3
   if(type == "uint8_t")
4
     return reinterpret_cast<char>(buffer)
5
   else if(type == "uint16_t") 
6
     return reinterpret_cast<uint16_t>(buffer)
7
}
1
Beschreibungsdatei:
2
3
Name: Test0
4
type: uint8_t
5
pos=0
6
size=1
7
8
Name: Test1
9
type: uint8_t
10
pos=1
11
size=1
12
13
Name: Test2
14
type: uint16_t
15
pos=2
16
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)


Lesenswert?

Keiner ein Tipp oder ein kleinen schubster in die richtige Richtung für 
mich?

von xyz (Gast)


Lesenswert?

Bytearray oder void pointer.

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

von mh (Gast)


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)


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)


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.