Mit stringstream string in hex umwandeln
-
Nabend,
ich möchte gerne einen String in eine Hexadezimalzahl umwandeln. Dazu habe ich gedacht, könnte man einen stringstream verwenden, was aber nicht so wirklich funktioniert.
#include <iostream> #include <sstream> #include <string> using namespace std; int main() { stringstream ss; string s; s = "Hallo Welt"; ss << hex << s; //Diese Ausgabe ist eine Hexadezimalzahl cout << ss << endl; s = ss.str(); //Bei dieser Ausgabe kommt wieder der //String raus... cout << s << endl; }Wenn das nicht funktioniert, wie kann ich es sonst machen, außer selber einen Algorithmus dafür zu schreiben?
Und wozu soll stringstream dann da sein?Danke,
Gruß Squall
-
int main() { string s1("Hallo Welt"); ostringstream oss; oss << hex; std::copy(s1.begin(), s1.end(), ostream_iterator<short>(oss, " ")); cout << oss.str() << endl; }
-
...
-
Klasse, es funktioniert.
#include <iostream> #include <sstream> #include <string> #include <iterator> using namespace std; int main() { stringstream ss; string s; s = "Hallo Welt!"; ss << hex; copy(s.begin(), s.end(), ostream_iterator<short>(ss, " ")); cout << s << endl; }Also diese Iteratoren sind zur Umwandlung von Datentypen da? (Hatte ich zuvor noch nichts wirklich drüber gelesen; auch mit Templates kenne ich mich nur waage aus...)
Also bei dem Beispiel wird ohne den Iterator der String wieder ausgegeben. Dies passiert, weil bei der Zuweisung dieser Hex-Zahl intern die Zahl sozusagen wieder in einen String gewandelt wird, richtig?
Und mit dem Iterator wird die Hex-Zahl als String geschrieben?Danke,
Gruß Squall
-
Squall schrieb:
Also diese Iteratoren sind zur Umwandlung von Datentypen da? (Hatte ich zuvor noch nichts wirklich drüber gelesen; auch mit Templates kenne ich mich nur waage aus...)
Also bei dem Beispiel wird ohne den Iterator der String wieder ausgegeben. Dies passiert, weil bei der Zuweisung dieser Hex-Zahl intern die Zahl sozusagen wieder in einen String gewandelt wird, richtig?
Und mit dem Iterator wird die Hex-Zahl als String geschrieben?Danke,
Gruß SquallNe, die Iteratoren sind zum Zugriff auf die Elemente eines Containers da. In diesem Fall ist String Dein Container, und begin() gibt Dir den Iterator auf das erste Element (also einen Char) zurück.
Das "Problem" ist, dass die Streams für chars so überladen sind, dass sie sie als Zeichen interpretieren. Es werden also immer die Zeichen ausgegeben, und nicht deren ASCII-Werte.
Airdamn kopierte alle Elemente im String in den Stringstream, dabei interpretiert (castet) er die einzelnen Chars aber zu short. Die shorts werden vom stringstream dann auch tatsächlich als Zahlen behandelt.Noch direkter geht es übrigens so:
std::string s1("Hallo Welt"); std::cout << std::hex; std::copy(s1.begin(), s1.end(), std::ostream_iterator<short>(std::cout, " "));Was intern abläuft kannst Du Dir in etwa so vorstellen (an die anderen: bitte nicht allzu kleinkariert sein)
std::string s1("Hallo Welt"); std::cout << std::hex; for(size_t n = 0; n != s1.size(); ++n) { std::cout << static_cast<short>(s1[n]) << " "; } std::cout << '\n';
-
+---+---+---+---+---+---+ | | | | | | | +---+---+---+---+---+---+ | | | | | | | +---+---+---+---+---+---+ | | | | | | | +---+---+---+---+---+---+ | | | | | | | +---+---+---+---+---+---+ | | | | | | | +---+---+---+---+---+---+oder immernoch zu kleinkariert?

-
Vielen Dank für die Erläuterung.
Nun bin ich wunschlos glücklich!
Gruß
Squall