string zu char (für switch) konvertieren?
-
Stehe noch ganz am Anfang mit c++ und habe bisher keine Lösung für mein Problem gefunden.
Mit der Zeilestd::string zeichen1 = s.substr(wasposition+4, 1);
lese ich aus dem String s ein einziges Zeichen als Substring aus (4 Stellen hinter dem Punkt "wasposition"). Es ist eine "Ziffer" in hex (kann also 0 bis f sein). Ich brauche jedoch ein char, um es in einer switch-Anweisung mit cases von 0 bis f erkennen zu können. Womit kann man diesen string zu char konvertieren? Habe mit "try and error"
schon einiges versucht (zeichen1.c_str() , Umweg über atoi (kann offenbar nur dezimal erkennen) und itoa, reinterpret_cast), aber nix war für switch verwertbar. Wie geht's? Kann man vielleicht gar keinen String zu einem einzigen Char-Zeichen umwandeln?
Jens
-
Warum so kompliziert?
char c = s[wasposition+4];
-
PS: Es wäre auch ok., wenn ich aus dem zeichen1 direkt eine 4-stellige Binärzahl (z.B. aus "d" wird 1101) bekomme. Geht das? Dann würde ich den weiteren Bearbeitungsweg abändern.
Jens
-
Bashar schrieb:
Warum so kompliziert?
char c = s[wasposition+4];
Oops, da hatten wir wohl gleichzeitig getippt.
Wenn das so einfach geht, wäre klasse :-), werde ich gleich mal testen.
Habe schon geahnt, dass es vielleicht eine einfachere Lösung gibt.
Jens
-
Bashar schrieb:
Warum so kompliziert?
char c = s[wasposition+4];
Es geht!
Danke!!
Endlich kann's weitergehen.(hatte Stunden daran rumgewurschtelt bis ich darauf kam, in einem Forum zu fragen).
Jens
-
Gibt es eigentlich einen Datentyp für Binärzahlen? Integer ist wohl nur für Dezimalzahlen (ich möchte die unterschiedlichen Bits zweier Binärzahlen erkennen).
j.
-
meines Wissens nimmt man da boolean-felder d.h. bool-arrys..
true == bit gesetzt.(1)
false == bit nicht gesetzt.(0)
-
s gibt tatsächlich in C (und dementsprechend auch in C++) die selten genutzte Möglichkeit, Bitarrays anzulegen. Das sieht dann in etwa so aus:
struct bitArray { unsigned anfang: 6; //die ersten 6 Bits sind unter dem Namen anfang ansprechbar unsigned : 6; //diese 6 Bits sind nicht ansprechbar, sie erzeugen eine "Lücke" unsigned ende : 4; };
Je nach Computertyp werden diese Bitarrays dann in unterschiedlicher Weise abgespeichert (Stichwort Little-/Big-Endian)
Das könnte man für einen Cast einer gegebenen Zahl verwenden, um diese dann bitweise auszugeben. Es gibt zwar andere Möglichkeiten, die auch eigentlich besser sind, aber allein zu wissen, dass es diese Möglichkeit gibt halte ich für gut
-
Deadlef schrieb:
s gibt tatsächlich in C (und dementsprechend auch in C++) die selten genutzte Möglichkeit, Bitarrays anzulegen. Das sieht dann in etwa so aus:
struct bitArray { unsigned anfang: 6; //die ersten 6 Bits sind unter dem Namen anfang ansprechbar unsigned : 6; //diese 6 Bits sind nicht ansprechbar, sie erzeugen eine "Lücke" unsigned ende : 4; };
Je nach Computertyp werden diese Bitarrays dann in unterschiedlicher Weise abgespeichert (Stichwort Little-/Big-Endian)
Das könnte man für einen Cast einer gegebenen Zahl verwenden, um diese dann bitweise auszugeben. Es gibt zwar andere Möglichkeiten, die auch eigentlich besser sind, aber allein zu wissen, dass es diese Möglichkeit gibt halte ich für gutDer Compiler wird da ja dann nichts alignen oder?
-
jenss schrieb:
Gibt es eigentlich einen Datentyp für Binärzahlen? Integer ist wohl nur für Dezimalzahlen (ich möchte die unterschiedlichen Bits zweier Binärzahlen erkennen).
j.Nein, int ist für Binärzahlen. Genauergesagt, für (ganze) Zahlen allgemein, aber Computer rechnen halt normalerweise im Binärsystem
An die einzelnen Bits kommst du mithilfe von Bitoperatoren, die du dir mal anschauen solltest: & (Bitweises AND), | (bitweises OR), ^ (bitweises XOR), ~ (bitweise Negation), << (Linksschieben), >> (Rechtsschieben). Vorsicht beim Schieben negativer Zahlen, für Bitoperatoren bietet sich idR eher ein unsigned-Typ an.
-
Deadlef schrieb:
struct bitArray { unsigned anfang: 6; //die ersten 6 Bits sind unter dem Namen anfang ansprechbar unsigned : 6; //diese 6 Bits sind nicht ansprechbar, sie erzeugen eine "Lücke" unsigned ende : 4; };
Auch ganz nett is das ganze in Kombination mit ner union.
struct bitStruct{ unsigned char first : 1; unsigned char : 6; unsigned char last : 1; }; union BitChar{ bitStruct bits; unsigned char value; }; BitChar c; //wert zuweisen c.value=3; //Bits setzen c.bits.first=1; //Ausgabe cout<<c.value<<endl;