Versionen dieses Beitrags

c binary mode für stdin

pl
  • c binary mode für stdin
  • hi @Robert B.
  • > ich habe ein paar Fragen zu deinem Code:
  • >
  • > > Der Trick besteht darin beim Einlesen der Parameterliste die Längenangabe mitzunehmen, das sieht dann so aus:
  • > >
  • > > ~~~c
  • > > /* Speicher anfordern, Längenangaben liegen vor */
  • > > new->name = (char*)malloc(alen+1);
  • > > new->value = (char*)malloc(vlen+1);
  • > > ~~~
  • >
  • > Wenn ich mit die Definition der `struct` unten anschaue, dann wäre es doch sinnvoll, deren Attribute `alen` und `vlen` zu nutzen und nicht (globale?) Variablen, also
  • Meine Liste PARAM ist nicht global, sie existiert nur im scope der main, da wird der Pointer ins Leben gerufen und an die readParam() übergeben.
  • > Ich habe zudem unsigned int durch size_t ersetzt, denn size_t ist groß genug um die Speichermenge für malloc zu enthalten. Auf einem 64-Bit-System ist…
  • Das wäre aber falsch. `vlen` ist definitiv die Anzahl der Bytes, die ist von der Architektur unabhängig. Was ich jedoch geändert habe:
  • ~~~c
  • struct PARAM{
  • unsigned int vlen;
  • unsigned int alen;
  • char *name;
  • unsigned char *value;
  • struct PARAM *next;
  • };
  • ~~~
  • denn die Oktettenwertigkeiten sind ja alle positiv. Sonst würde aus 0xFF eine -1 und das irritiert beim Debuggen. Funktional ists jeoch egal ob unsigned oder nicht.
  • Ansonsten ist `vlen+1` schon tricky: Der Platz für die 0 zum Termineren ist reserviert, und `vlen` selbst ist die exakte Länge der Binary (falls das ein Input type file ist). Bei mehreren gleichnamigen inputs gibts natürlich auch für Uploads genausoviele name+value Pärchen.. alles brav im Hauptspeicher für den wahlfeien Zugriff 😉
  • Und vielen Dank für Deine Hinweise!
  • PS: Interessanterweise nimmt jQuery(form).serializeArray() bei der <textarea> den Zeilenumbruch als 0D 0A also 2 Zeichen. Mein Serializer liest da nur ein Zeichen.