posługiwać się std::stringstream
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
następujący przykład daje -65538
wynik:
#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;
}
W nowym standardzie C ++ 11 jest kilka nowych funkcji narzędziowych, z których możesz skorzystać! w szczególności istnieje rodzina funkcji „ciąg do numeru” ( http://en.cppreference.com/w/cpp/string/basic_string/stol i http://en.cppreference.com/w/cpp/string/ basic_string / stoul ). Są to zasadniczo cienkie opakowania wokół funkcji konwersji ciągów na liczby w języku C, ale wiedzą, jak sobie radzić zstd::string
Tak więc najprostsza odpowiedź na nowszy kod prawdopodobnie wyglądałaby następująco:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
UWAGA: Poniżej znajduje się moja oryginalna odpowiedź, która zgodnie z edycją nie jest odpowiedzią pełną. Aby uzyskać funkcjonalne rozwiązanie, umieść kod powyżej linii :-).
Wydaje się, że ponieważ lexical_cast<>
jest zdefiniowany jako semantyka konwersji strumienia. Niestety, strumienie nie rozumieją notacji „0x”. Więc zarówno ta, jak boost::lexical_cast
i moja wyrzucona ręka nie radzą sobie dobrze z ciągami hex. Powyższe rozwiązanie, które ręcznie ustawia strumień wejściowy na hex, poradzi sobie z tym dobrze.
Boost ma też kilka rzeczy do zrobienia, które ma również niezłe możliwości sprawdzania błędów. Możesz go używać w ten sposób:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
Jeśli nie masz ochoty korzystać z funkcji Boost, oto lekka wersja rzutowania leksykalnego, która nie sprawdza błędów:
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
którego możesz użyć w ten sposób:
// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");