utilisation std::stringstream
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
l'exemple suivant produit -65538
comme résultat:
#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;
}
Dans le nouveau standard C ++ 11, vous pouvez utiliser quelques nouvelles fonctions utilitaires! plus précisément, il existe une famille de fonctions "chaîne à nombre" ( http://en.cppreference.com/w/cpp/string/basic_string/stol et http://en.cppreference.com/w/cpp/string/ basic_string / stoul ). Ce sont essentiellement des enveloppes minces autour des fonctions de conversion de chaîne en nombre de C, mais savent comment gérer unstd::string
Ainsi, la réponse la plus simple pour un code plus récent ressemblerait probablement à ceci:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
REMARQUE: Voici ma réponse originale, qui, comme le dit la modification, n'est pas une réponse complète. Pour une solution fonctionnelle, collez le code au-dessus de la ligne :-).
Il semble que puisque lexical_cast<>
est défini pour avoir une sémantique de conversion de flux. Malheureusement, les flux ne comprennent pas la notation "0x". Donc, le boost::lexical_cast
et ma main ont roulé un ne gèrent pas bien les cordes hexagonales. La solution ci-dessus qui définit manuellement le flux d'entrée sur hexa le gérera très bien.
Boost a également quelques trucs pour le faire, qui a également de bonnes capacités de vérification des erreurs. Vous pouvez l'utiliser comme ceci:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
Si vous n'avez pas envie d'utiliser boost, voici une version allégée du cast lexical qui ne vérifie pas les erreurs:
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
que vous pouvez utiliser comme ceci:
// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");