uso std::stringstream
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
il seguente esempio produce -65538
come risultato:
#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;
}
Nel nuovo standard C ++ 11, ci sono alcune nuove funzioni di utilità che puoi usare! in particolare, esiste una famiglia di funzioni "stringa a numero" ( http://en.cppreference.com/w/cpp/string/basic_string/stol e http://en.cppreference.com/w/cpp/string/ basic_string / stoul ). Si tratta essenzialmente di wrapper sottili attorno alle funzioni di conversione da stringa a numero di C, ma sanno come gestire astd::string
Quindi, la risposta più semplice per il codice più recente dovrebbe apparire così:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
NOTA: Di seguito è la mia risposta originale, che come dice la modifica non è una risposta completa. Per una soluzione funzionale, inserisci il codice sopra la linea :-).
Sembra che da allora lexical_cast<>
sia definito per avere la semantica della conversione del flusso. Purtroppo, i flussi non comprendono la notazione "0x". Quindi sia la boost::lexical_cast
mia che la mia mano arrotolata non si comportano bene con le stringhe esadecimali. La soluzione di cui sopra che imposta manualmente il flusso di input su esadecimale lo gestirà bene.
Boost ha anche alcune cose da fare, che ha anche delle buone capacità di controllo degli errori. Puoi usarlo in questo modo:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
Se non hai voglia di usare boost, ecco una versione leggera del cast lessicale che non verifica errori:
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
che puoi usare in questo modo:
// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");