utiliser std::stringstream
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
l'exemple suivant génère -65538
le résultat est:
#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;
}
EDIT: C++11 mise à jour. Dans la nouvelle norme, il y a un peu de nouveau les fonctions de l'utilitaire qui vous pouvez faire usage de! plus précisément, il existe une famille de "chaîne à nombre de" fonctions (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 wrappers minces autour de C de la chaîne de conversion des numéros de fonctions, mais de savoir comment traiter avec un std::string
Donc, la réponse la plus simple pour le code le plus récent serait probablement ressembler à ceci:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
REMARQUE: ci-Dessous est ma réponse originale à cette question, qui, comme l'éditer dit n'est pas une réponse complète. Pour une solution fonctionnelle. Coller le code ci-dessus de la ligne :-).
EDIT: Il semble que depuis lexical_cast<>
est défini pour avoir de conversion de flux sémantique. Malheureusement, les ruisseaux ne comprends pas le "0x" notation. Donc, à la fois l' boost::lexical_cast
et mon roulé à la main de l'un de ne pas traiter ainsi avec hex cordes. La solution ci-dessus qui définit manuellement le flux d'entrée à l'hex qu'il va la traiter correctement.
Boost a quelques trucs à faire aussi bien, qui a une belle erreur de vérification des capacités. 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 ne vous sentez pas à l'aide de coup de pouce, voici une version légère de l'lexicale cast qui n'a pas de contrôle d'erreur:
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");