C++ Deserialize char array basierend auf Beschreibungsdatei

Gast #6337502
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?
Gast #6337871
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren