string konvertieren

Hallo,

ich habe hier ein Problem, wo ich nicht weiter kommen.

Also:

1. In einem std::stringstream habe ich den Inhalt von einem Bild ( inhalt von stringstream sind binär daten )
2. Ich möchte die Binär Daten nun per Netz verschicken
3. Ich habe dies wie folgt gemacht.

Code:
std::stringstream stream;
cout<<"Binär Daten : "<<stream.str()<<std::endl;  // Binär Daten stimmen
cout<<"Binär Daten : "<<stream.str().c_str()<<std::endl; // Binär Daten stimmen nicht mehr

Problem ist halt, per stream.str() bekomme ich die korrekten Binär Daten, per stream.str().c_str() komme ich nicht mehr an die Daten, es wird einfach nichts ausgegeben, es werden auch mit .c_str() signed char ausgegeben, aber die Binär Daten bestehen aus unsigned char.

Wie kann ich nun Binär Daten übers Netzwerk mit send() verschicken ?(

Meine Idee war :

Code:
send(socket,stream.str.c_str(),stream.str().size(),0);

Es geht aber nicht da

1. Per c_str() bekomme ich keine Daten raus
2. Send verschickt ja nur ( soweit ich weiß ) signed char...
 
Also irgendwie ist das komisch was du da machst ;)
Wenn du Binärdaten hast, eben z.B. dein Bild, dann speichert man das normalerweise ja nicht in einem string, da ein string ja eigentlich das genaue Gegenteil ist, nämlich Text-Daten.
Binärdaten speichert man normalerweise in einem Byte-Array, also entweder unsigned char[] oder char[]. In einem String wird intern zwar selbiges verwendet, aber der Unterschied ist der, dass sich die Länge eines Strings dadurch defineirt wann das String-Ende-Zeichen ('\0') auftritt, während ein Byte-Array eben so lang ist, wie das Array groß ist (logisch). Es macht im übrigen auch relativ wenig Sinn Binär-Daten per cout als String auszugeben, da man diese eh nicht interpretieren kann, und da man wohl eh nicht alles angezeigt kriegt, da irgendwann ein Byte im Array kommt, welches als '\0' interpretiert wird (d.h. danach wird nichts mehr ausgegeben, obwohl evtl. noch tausende von Bytes vorhanden sind). Genau das wird auch dein Problem mit send sein, denn mit c_str() lässt du dir einen C-String zurückgeben. Dieser C-String ist eben mit '\0' begrenzt. Wenn du jetzt z.B. Pech hast, das das erste Byte schon als '\0' interpretiert wird, dann kriegst du einen leeren C-String zurück, und es wird natürlich nichts versandt.

Also lange Rede, kurzer Sinn: Speicher deine Binärdaten ganz normal in nem Byte-Array und verschicke die dann mit send, dann klappts auch.
 
Hi,

danke erstmal.

Ich muss die Sachen aber in einem String haben. Es ist so, ich habe in meinem Programm nun das Bild, es wird durch ein Objekt der Klasse Image representiert, dieses Objekt wird mittels boost serializiert. Boost speichert die Sachen eigentlich in Datei ab, man kann sich die Sachen aber in einem stringstream ablegen. Nun kommt nämlich das Problem, per stringstream.str() komme ich zum String, und per stringstream.str().c_str() zu einem char array bzw. char pointer. Ich Versuche nun irgendwie vernünftig an die Sachen aus dem Stringstream zu kommen und per Netz das Bild ( also eigentlich das gesammte Objekt, in dem u.a. das Bild abgelegt ist ) per Netz zu verschicken.
 
Ich kenne mich mit Socketprogrammierung noch nicht so aus, aber...
mach doch einfach bevor du es sendest einen Pointercast.
Du erstellst also einen Pointer auf das zu sendende Objekt, Castest diesen Pointer dann zu Char und los geht es.
Beim Empfang machst du es genau umgekehrt.
Wie gesagt, ist nur so ein gedanke vonmir.
mfg

sw33t
 
Geht prinzipiell schon, ist aber böse. Stichwort Padding
Und wenn das Empfänger-Programm in einer anderen Sprache gecodet ist, wird das noch übler.
 
Zurück
Oben