2009-08-10 8 views
0

Ich soll eine Bibliothek in C++ schreiben, die die Verbindungen mit dem KAD-Netzwerk behandeln sollte. Ich versuche ein Paket zu erstellen, das den von aMule & co.Char Array Zuweisung und Verwaltung

Und ich kann wirklich nicht verstehen den Unterschied zwischen diesem Code:

buffer = "\xe4\x20\x02"; 

und zum Beispiel diesen Code:

char p_buffer[36]; 
p_buffer[0] = 0xe4; 
p_buffer[1] = 0x20; 
p_buffer[2] = 0x02; 

buffer = p_buffer; 

(Puffer ist ein privates Attribut der Klasse, während p_buffer ist eine lokale Variable)

das Erfassen der Pakete mit wireshark gibt mir andere Ergebnisse (der erste ist richtig, wie ich wollte, der zweite nicht), als ob ich etwas falsches wi tat th Little Endian/Big-Endian-Notationen, denke ich ...

und warum in den Konstruktor einer Klasse kann ich eine [Private] "char * buffer" wie diese nicht ändern:

buffer[0] = 0xe4; 

? (Es funktioniert nicht, tritt ohne jede Spur zurück Fehler)

(wenn es eine Rolle, kann ich bin mit Crypto ++ und Boost-Bibliotheken)

Dank im Voraus für jeden help_

Antwort

6

Ihr erstes Codebeispiel entspricht in etwa auf:

static const char buffer_internal[4] = { 0xe4, 0x20, 0x02, 0x00 }; 
buffer = buffer_internal; 

Die beiden Unterschiede sind hier:

  • Die buf fer ist nullterminiert
  • Der Puffer ist nicht änderbar. Der Versuch, sie zu ändern, stürzt wahrscheinlich ab.

Ihr zweites Beispiel weist einen modifizierbaren 36-Byte-Puffer zu. Dieser Puffer wird jedoch auch verworfen, wenn er außer Funktion gesetzt wird - seien Sie hier sehr vorsichtig, dass er nicht verwendet wird, nachdem er freigegeben wurde.

Wie für das dritte Beispiel haben Sie "Puffer" initialisiert, wenn es ein Zeiger ist? Sie haben nicht genügend Informationen angegeben, um Ihren Fehler wirklich zu diagnostizieren - die vollständige Klassendeklaration und der Konstruktor wären hilfreich.

+0

ok. Die Frage war in diesem "statischen" Schlüsselwort. vielen Dank. –

+0

Fügen Sie nicht einfach "statisch" ein, ohne zu wissen, was es bedeutet - wenn Sie mehrere Instanzen dieser Klasse, Rekursion oder mehrere Threads haben, werden Sie wahrscheinlich mit Datenverfälschung enden, weil Sie den gleichen Puffer teilen an mehr als einem Ort. Ich würde Ihnen bessere Ratschläge geben, aber Sie waren zu unspezifisch bezüglich Ihres Programms, um konkrete Vorschläge zu machen. – bdonlan

2

"" Literale haben eine implizite NUL-Beendigung, sofern sie nicht durch eine explizite Array-Länge eingeschränkt ist (in diesem Fall nicht). Auch in dem zweiten Fall, da p_buffer eine lokale Variable ist, d. H. Eine auf dem Stapel zugewiesene automatische Variable, wird der Inhalt davon nicht auf Null oder irgendetwas initialisiert, sondern enthält alles, was in dem zugrundeliegenden Stapelspeicher vorhanden ist.

2

Nur ein Vorschlag - wenn Sie bereits Boost verwenden, schauen Sie in boost::array für vereinfachte Pufferverwaltung fester Länge und in boost::shared_array für den Umgang mit Puffer variabler Länge.