2012-04-04 2 views
3

Ich habe einige Nachforschungen angestellt, kann aber keine endgültige Zustimmung oder Ablehnung finden.Binäre Serialisierung von Daten mit variabler Länge und Nulllängen-Arrays, ist es sicher?

Was ich will, ist eine feste Größe Struktur + variabler Länge Teil, so dass die Serialisierung in einfacher und weniger fehleranfälliger Weise ausgedrückt werden kann.

struct serialized_data 
{ 
    int len; 
    int type; 
    char variable_length_text[0]; 
}; 

Und dann:

serialize_data buff = (serialize_data*)malloc(sizeof(serialize_data)+5); 
buff->len=5; 
buff->type=1; 
memcpy(buff->variable_length_text, "abcd", 5); 

Leider kann ich nicht finden, wenn MSVC, GCC, Klappern usw., mit ihm in Ordnung sind.

Vielleicht gibt es einen besseren Weg, um das gleiche zu erreichen?

Ich will nicht wirklich diese hässlichen Abgüsse rundum:

memcpy((char*)(((char*)buffer)+sizeof(serialize_data)), "abcd", 5); 
+1

Die 'char variable_length_text sein sollte [1];', aber ja, es ist sicherlich ein besserer Weg, das gleiche zu erreichen. – ildjarn

+4

Wählen Sie eine Sprache. Interessieren Sie sich für C++ oder C? –

+1

Sie werden diesen Artikel wahrscheinlich nützlich finden. Beantwortet nicht die Tragbarkeitsfrage, gibt aber einen Einblick in dieses Muster http://blogs.msdn.com/b/oldnewthing/archive/2004/08/26/220873.aspx – JaredPar

Antwort

2

Dieses Programm wird ein Null-Länge-Array verwendet wird. Dies ist nicht C, sondern eine GNU-Erweiterung.

http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

Ein gemeinsames Idiom in C89, die so genannte struct hacken, verwenden sollte:

struct serialized_data 
{ 
    int len; 
    int type; 
    char variable_length_text[1]; 
}; 

seine gemeinsame Verwendung als flexible Array leider nicht streng Conforming ist.

C99 kommt mit etwas ähnlich, um die gleiche Aufgabe zu erfüllen: eine Funktion namens flexible Array-Mitglied. Hier ist ein Beispiel direkt aus dem Standard (C99, 6.7.2.1p17)

struct s { int n; double d[]; }; 
int m = 12; // some value 
struct s *p = malloc(sizeof (struct s) + sizeof (double [m])); 
+0

Kann ich C99 verwenden und sicher sein, dass es auf MSVC7/8/9, GCC und Clang funktioniert? – Coder

+0

C99 wird von gcc und clang unterstützt, aber nicht von MSVC. Der struct-Hack ist zwar nicht streng konform, ist jedoch ziemlich verbreitet und sollte für C89-Compiler in Betracht gezogen werden. – ouah

Verwandte Themen