utilizar std::stringstream
unsigned int x;
std::stringstream ss;
ss << std::hex << "fffefffe";
ss >> x;
el siguiente ejemplo produce -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;
}
¡En el nuevo estándar C ++ 11, hay algunas nuevas funciones de utilidad que puede utilizar! específicamente, hay una familia de funciones "string to number" ( http://en.cppreference.com/w/cpp/string/basic_string/stol y http://en.cppreference.com/w/cpp/string/ basic_string / stoul ). Estos son esencialmente envoltorios delgados alrededor de las funciones de conversión de cadena a número de C, pero saben cómo lidiar con unstd::string
Entonces, la respuesta más simple para el código más nuevo probablemente se vería así:
std::string s = "0xfffefffe";
unsigned int x = std::stoul(s, nullptr, 16);
NOTA: A continuación se muestra mi respuesta original, que como dice la edición no es una respuesta completa. Para una solución funcional, pegue el código sobre la línea :-).
Parece que ya lexical_cast<>
está definido para tener semántica de conversión de flujo. Lamentablemente, las transmisiones no entienden la notación "0x". Así que tanto la boost::lexical_cast
mano como la mía no se manejan bien con cuerdas hexagonales. La solución anterior que establece manualmente el flujo de entrada en hexadecimal lo manejará bien.
Boost también tiene algunas cosas para hacer esto, que también tiene algunas buenas capacidades de verificación de errores. Puedes usarlo así:
try {
unsigned int x = lexical_cast<int>("0x0badc0de");
} catch(bad_lexical_cast &) {
// whatever you want to do...
}
Si no tiene ganas de usar boost, aquí hay una versión ligera del elenco léxico que no realiza ninguna comprobación de errores:
template<typename T2, typename T1>
inline T2 lexical_cast(const T1 &in) {
T2 out;
std::stringstream ss;
ss << in;
ss >> out;
return out;
}
que puedes usar así:
// though this needs the 0x prefix so it knows it is hex
unsigned int x = lexical_cast<unsigned int>("0xdeadbeef");