[C++] Konvertierung von unsigned char nach CString

Overloader

Cadet 4th Year
Registriert
Jan. 2004
Beiträge
91
Hallo,

wie konvertiere ich in c++ eine unsigned char Variable zu einem String?

Ich lese einen REG_SZ Wert aus der Registry aus und brauche einen String um z.B. Abzufragen ob der REG_SZ Wert yes oder no ist. Hier mein Quellcode:

Deklaration:
unsigned char temp;
unsigned char *Value;
DWORD dwLen;

Code:
//Schlüssel öffnen
RegOpenKeyEx(HKEY_CURRENT_USER,"Control Panel\\Sound\0", 0, KEY_READ, &MyKey);
// Größe des Wertes abfragen
lnRes = RegQueryValueEx(MyKey,"Beep\0",NULL, NULL, NULL, &dwLen);
dwValue = (unsigned char *)malloc(dwLen);
//Wert abfragen
lnRes = RegQueryValueEx(MyKey,"Beep\0",NULL, NULL, Value, dwLen);
temp = *Value;

Vielen Dank schon mal im voraus.

mfg
Overloader
 
1. Fehler:
dwValue = (unsigned char *)malloc(dwLen);
>> Die Variable heisst Value und nicht dwValue.

2. Abfrage:
if (temp&0xDF=='Y') { /* string fängt mit y oder Y an -> yes */ }
else { /* kein y vorne -> no */ }
free(Value);
 
@beide
Macht es uns einfach und benutzt doch bitte die Code- oder PHP-Tags. z.B.
PHP:
unsigned char temp;
unsigned char *Value;
Und wenn ihr schon in C++ programmiert, dann nutzt doch die Operation "new" um Speicher zu allokieren und "delete" um ihn wieder freizugeben.
 
Juchuh -g- Der erste Moderator, mit dem ich mich anlegen darf =) Ich wusste doch, dass mir in diesem Forum irgendetwas fehlt -g-

Aaaaalso...
1.a: Ich habe auf die Code-Tags _ganz bewusst_ verzichtet, da sie sich bei den beiden kurzen Schnipseln einfach nicht lohnen... Für die drei Zeilen, die ja eigentlich nur zwei ("if {} else {}" - "free()") sind nicht und für die eine Zeile schon gar nicht: Kurze Schnipsel ohne tiefere Struktur -> keine Tags...
1.b: ... und wenn schon Tags, dann ganz bestimmt nicht
PHP:
 für C(++)-Code -g-
2.: Nicht überall, wo "++" drübersteht ist auch wirklich "++" drin. Warum es mit aller Gewalt reinprügeln? (Davon abgesehen, dass ich dann Code-[B]Änderungen[/B] hätte posten müssen, statt nur eine Code-[B]Erweiterung[/B]... malloc verträgt sich nicht so mit delete...)
 
Nicht angepisst fühlen, ich tue es ja auch nicht :).

1.a Erklärung akzeptiert, aber es wäre trotzdem lesbarer.
1.b Ich schlug die PHP Tags vor, weil die C++-Tags kein Syntaxhighliting haben (was die Lesbarkeint wieder erhöht).
2. Ich wollte nur darauf hinweisen, dass in C++ malloc durhc new ersetzt wurde. Ich kenne viele Leute die sagen, dass sie C++ können und von "new" noch nix gehört haben, weil sie halt von C auf C++ umgestiegen sind.

Und was das mitteinander anlegen betrifft: Wir Mods wollen doch nur das Beste für unsere Boardies :D.
 
Hehe :)
Um mich dazu zu bekommen, mich angepisst zu fühlen, müsstest du von einer Tomate im Schach besiegt werden können :D
1.a > mist, mit wem soll ich mich denn jetzt bloss keilen? ^_^
1.b > PHP highlightet von dem Kram auch nur das * als Operator und das ; -> von daher -g-
2 > Mit C hab ich mich nie beschäftigt... ich bin von PHP auf C++ mit QT umgestiegen und fang gerade an, ohne QT zu arbeiten :)

"Wir Mods wollen doch nur das Beste für unsere Boardies :D." ... Ich bin selbst Mod (Wenn auch nicht hier - wer hätte DAS erwartet?)... also versuchs gar nicht erst ^_^
 
Overloader schrieb:
lnRes = RegQueryValueEx(MyKey,"Beep\0",NULL, NULL, NULL, &dwLen);
Warum schreibst Du hier "Beep\0"? Da Beep ein char-Literal ist, ist die terminierende 0, die die Windows-API erwartet, schon mit dran. ;) Außerdem müsstest Du dann \000 schreiben, wenn ich das richtig sehe :-)

So, genug kluggesch... :), um den Wert umzuwandeln, schreibst Du das hier:
Code:
const CString str (reinterpret_cast<char*>Value);

Der reinterpret_cast entspricht quasi dem "alten", unsichern Cast unter C. Man verwendet diesen Cast, um solche unsicheren Umwandelungen explizit zu kennzeichnen. Mit dieser Zeile wird dann also ein CString angelegt, der Value im Konbstruktor übergeben bekommt, sofern ein passender Konstruktor existiert. Und da CString einen Konstruktor für char* besitzt, funktioniert es problemlos.

Nun kannst Du sowas hier schreiben:
Code:
if (str == "yes") // achtung, dieser Vergleich ist case-sensitive
{
  // mache irgendwas
}
.....

Vergiss am Schluss nicht, den Speicher von malloc mit free wieder freizugeben. ;) Ob man an dieser Stelle new oder malloc verwendet ist relativ egal - der Unterschied zwischen new und malloc ist nämlich, dass new auch noch den Konstruktor des angelegten Objektes aufruft und malloc nicht. Da der "Konstruktor" an dieser Stelle genau garnichts macht, spielt es keine Rolle. (Natürlich könnte man es als 'besseren Stil' werten, mit new zu arbeiten, aber es funktioniert hier ganz genauso)


Btw, wenn Du einen boolschen Wert abspeichern willst, würde ich ein DWORD verwenden und dann auf == 0 -> falsch/nein bzw. != 0 -> wahr/ja prüfen.
 
Zuletzt bearbeitet:
Zurück
Oben