verwenden std::stringstream
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
Das folgende Beispiel ergibt -65538
das Ergebnis:
#include <sstream>
#include <iostream>
int main() {
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
// output it as a signed type
std::cout << static_cast<int>(x) << std::endl;
}
Im neuen C ++ 11-Standard gibt es einige neue Dienstprogrammfunktionen, die Sie verwenden können! Insbesondere gibt es eine Familie von "String to Number" -Funktionen ( http://en.cppreference.com/w/cpp/string/basic_string/stol und http://en.cppreference.com/w/cpp/string/). basic_string / stoul ). Dies sind im Wesentlichen dünne Wrapper um Cs Funktionen zur Konvertierung von Zeichenfolgen in Zahlen, die jedoch wissen, wie man mit a umgehtstd::string
Die einfachste Antwort für neueren Code würde also wahrscheinlich so aussehen:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
HINWEIS: Unten ist meine ursprüngliche Antwort, die, wie in der Bearbeitung angegeben, keine vollständige Antwort ist. Für eine funktionale Lösung kleben Sie den Code über die Zeile :-).
Es scheint, dass da lexical_cast<>
eine Stream-Konvertierungssemantik definiert ist. Leider verstehen Streams die "0x" -Notation nicht. Also gehen sowohl die boost::lexical_cast
als auch meine Hand gerollt nicht gut mit Hex-Saiten um. Die obige Lösung, bei der der Eingabestream manuell auf hex gesetzt wird, funktioniert einwandfrei.
Boost hat auch einige Dinge zu tun, die auch einige nette Funktionen zur Fehlerprüfung bieten. Sie können es so verwenden:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
Wenn Sie keine Lust auf Boost haben, finden Sie hier eine leichte Version der lexikalischen Besetzung, die keine Fehlerprüfung durchführt:
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
die Sie so verwenden können:
// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");