C++ Socket string/char Fehler?
-
Guten Abend,
und zwar habe ich folgendes Problem:
Ich habe mir einen Socket-Wrapper in C++ geschrieben, der sowohl raw sockets als auch ssl kann. Dieser funktioniert auch soweit ganz gut.
Diesen Socket benutze ich in einem C++ IRC-Bot, den ich gerade schreibe.
Aus einem XML-File lese ich die Color-Codes für das IRC-Protokoll aus. Der XML-Parser liefert mir die Ergebnisse standardmäßig als string zürück.
Soweit sogut. Wenn ich nun aber von dem Socket aus etwas in einen Channel im IRC schreiben möchte, werden die Zeichen irgendwie nicht richtig übertragen. D.h. anstatt Bold oder roten Text sehe ich diese komischen Color-Codes (\002 \0034, usw..).
Um die Sachen auf den Socket zu liefern, konvertiere ich den String mittels der c_str() methode vorher in einen char array um, damit der Socket damit arbeiten kann. Wenn ich den Text aber von hand eingebe also "\002 bla bla \002 bla" wird dieser korrekt auf dem Socket (mit Farbe, was auch immer) eingeliefert und im IRC so angezeigt.
Ein Kollege von mir meinte, dass es durchaus sein kann, dass wenn man von einem String in ein char array konvertiert da mal was bei kaputtgehen kann. Dieser konnte mir die Lösung aber leider auch nicht sagen.
Hatte jemand ähnliche Probleme, oder gar eine Lösung?Vielen Dank im vorraus
Greetz
-
"\002 bla bla \002 bla"
Da ist ja zweimal das Nullzeichen erhalten - oder meintest du "\\002 bla bla \\002 bla"?
Wenn mit dem char-Array gearbeitet wird, geht man in der Regel davon aus, dass das Nullzeichen das Ende des char-Arrays ist (z.B. wenn man alle Elemente durchgehen will, ala [/c]while (*CharArr++) mach was;[/c]Andernfalls glaube ich kaum, dass sich der string bei einer Konvertierung zu char* veraendert - wuerde mich jetzt sehr wundern. Die Standardbibliothek arbeitet bei string doch auch nur mit char-Arrays ... oder nicht?
Ich vermute ganz stark dass woanders der Wurm drin ist und nicht bei der Konvertierung (diese Erfahrung durfte ich heute sogar auch machen, siehe std::string to double-thread).
Gruss
Cartman
-
Hallo Cartman, vielen dank für deine Antwort. Nein die strings die ich hier reingeschrieben habe sind so schon richtig. Ich sehe auch das Problem nicht, und kann es mir leider auch nicht erklären wo es herkommt

-
Du ließt den String "\002" aus der XML Datei aus. Das ist für das Programm intern aber "\\002", heißt, das \ wird escaped. '\002' ist ein einzelnes Char. Was du in der XML Datei hast, ist aber "\002", also 4 Chars. Du musst also "\\002" aus der XML durch '\002' ersetzen.
Ich habe mir z.B. damals eine Funktion programmiert, die hat Textdateien eingelesen und die Textdateien sahen so aus:
Dies ist b und dies u.
Heißt, "b" wurde durch '\\002' ersetzt und "u" durch '\037'.
-
Hey feigling, danke für deine Antwort.
Das ist leicher gesagt als getan (leider). Habe schon jegliche Varianten probiert, entweder gab es einen Compiler error, oder er hat einfach nur wieder die Codes angezeigt

-
Das ist ungefähr mein Code von damals:
static int irc_replace_identifier(const char *text, char *processed) { unsigned int i, pos = 0, len = strlen(text); for(i = 0; i < len; i++) { if(text[i] == '$') { i++; if(text[i] == 'b') processed[pos++] = '\002'; else if(text[i] == 'u') processed[pos++] = '\037'; else if(text[i] == 'c') processed[pos++] = '\003'; else processed[pos++] = text[--i]; } else { processed[pos++] = text[i]; } } processed[pos] = '\0'; return pos; }aber in C++ und strings kannst du das sicherlich viel eleganter machen. Das oben ist C Code.
-
Eric Cartman schrieb:
Die Standardbibliothek arbeitet bei string doch auch nur mit char-Arrays ... oder nicht?
Soviel ich weiss, ist das nicht vorgeschrieben. Eine Array-Struktur ist aber sehr wahrscheinlich.
bla0r schrieb:
Das ist leicher gesagt als getan (leider). Habe schon jegliche Varianten probiert, entweder gab es einen Compiler error, oder er hat einfach nur wieder die Codes angezeigt

Hast du genügend Speicher für die
char*angelegt? Geh doch mal mit dem Debugger durch und schau genau, ab wo die Werte fehlerhaft sind.
-
<colors> <color info="Bold text" start-tag="[bold]" end-tag="[/bold]" start-code=\"002" end-code="\002" /> <color info="Underlined Text" start-tag="[red]" end-tag="[/red]" start-code="\0034" end-code="\0034" /> </colors>So sieht bspw. ein Teil meines XML-Files aus, ich habe wirklich schon fast alles durch. Dass ich es hardcoded machen kann, weiss ich. Ich wollte aber variabel bleiben, daher die XML-Geschichte.
Nexus schrieb:
Eric Cartman schrieb:
Die Standardbibliothek arbeitet bei string doch auch nur mit char-Arrays ... oder nicht?
Soviel ich weiss, ist das nicht vorgeschrieben. Eine Array-Struktur ist aber sehr wahrscheinlich.
bla0r schrieb:
Das ist leicher gesagt als getan (leider). Habe schon jegliche Varianten probiert, entweder gab es einen Compiler error, oder er hat einfach nur wieder die Codes angezeigt

Hast du genügend Speicher für die
char*angelegt? Geh doch mal mit dem Debugger durch und schau genau, ab wo die Werte fehlerhaft sind.Ich arbeite generell eher mit strings als mit char arrays

-
bla0r schrieb:
Ich arbeite generell eher mit strings als mit char arrays

Es geht aber nicht um generell, sondern die Anwendungsfälle, wo du mit
char*arbeitest. Zumindest hast du diese erwähnt.Die Formatierung scheint nicht ganz korrekt zu sein. Vielleicht bringst du Escapesequenzen und Raw-Strings an sich durcheinander. Wie bereits gesagt wurde, ist
'\\'im Code das Zeichen für einen Backslash, in der Ausführung sieht man aber nur noch'\'. Das kann auch mit anderen Escapesequenzen passieren.
-
Nexus schrieb:
bla0r schrieb:
Ich arbeite generell eher mit strings als mit char arrays

Es geht aber nicht um generell, sondern die Anwendungsfälle, wo du mit
char*arbeitest. Zumindest hast du diese erwähnt.Die Formatierung scheint nicht ganz korrekt zu sein. Vielleicht bringst du Escapesequenzen und Raw-Strings an sich durcheinander. Wie bereits gesagt wurde, ist
'\\'im Code das Zeichen für einen Backslash, in der Ausführung sieht man aber nur noch'\'. Das kann auch mit anderen Escapesequenzen passieren.Der socket "kann" ja qasi nur char. Das ist der Grund weshalb ich den string dann bevor er abgeschickt wird mit der methode c_str() in ein const char array umwandele.
Hmm...selbst wenn ich in dem XML-File ein \\ mache, passiert nichts

-
Wenn du "\002" in eine Textdatei reinschreibst dann sind das 4 Zeichen. Du willst aber '\002' also ein Zeichen haben.
Du musst entweder "\002" parsen und daraus ein '\002' machen oder dir eine alternative Darstellungsform in der XML Datei suchen.
Beide Loesungen wurden bereits genannt.
Deshalb nochmal:
"\002" sind 4 einzelne Zeichen. 4! Zeichen.
'\002' ist 1 einzelnes Zeichen. 1! Zeichen.Das ist wie '\n'
Wenn du \n in eine Textdatei schreibst, dann hat die Datei 2 Bytes naehmlich '\' und 'n'. Und hat kein newline Zeichen.