usar std::stringstream
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
o exemplo a seguir produz -65538
como resultado:
#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;
}
No novo padrão C ++ 11, existem algumas novas funções utilitárias que você pode usar! especificamente, há uma família de funções "string to number" ( http://en.cppreference.com/w/cpp/string/basic_string/stol e http://en.cppreference.com/w/cpp/string/ basic_string / stoul ). Trata-se de invólucros essencialmente finos em torno das funções de conversão de string para número, mas sabem como lidar com umstd::string
Portanto, a resposta mais simples para o código mais recente provavelmente seria assim:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
NOTA: Abaixo está a minha resposta original, que, como diz a edição, não é uma resposta completa. Para uma solução funcional, cole o código acima da linha :-).
Parece que desde lexical_cast<>
está definido para ter semântica de conversão de fluxo. Infelizmente, os fluxos não entendem a notação "0x". Então, tanto a boost::lexical_cast
mão quanto a minha mão rolada não lidam bem com cordas hexagonais. A solução acima, que define manualmente o fluxo de entrada como hexadecimal, lidará perfeitamente com isso.
O Boost também tem algumas coisas para fazer isso, que também oferecem alguns recursos interessantes de verificação de erros. Você pode usá-lo assim:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
Se você não gosta de usar o boost, aqui está uma versão leve do elenco lexical que não faz verificação de erro:
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
que você pode usar assim:
// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");