Quiero convertir una cadena hexadecimal a un entero con signo de 32 bits en C ++.
Entonces, por ejemplo, tengo la cadena hexadecimal "fffefffe". La representación binaria de esto es 11111111111111101111111111111110. La representación entera firmada de esto es: -65538.
¿Cómo hago esta conversión en C ++? Esto también debe funcionar para números no negativos. Por ejemplo, la cadena hexadecimal "0000000A", que es 00000000000000000000000000001010 en binario y 10 en decimal.
int
. "32 bit entero con signo" podría ser int32_t o __int32 etc.Respuestas:
utilizar
std::stringstream
el siguiente ejemplo produce
-65538
como resultado:¡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 un
std::string
Entonces, la respuesta más simple para el código más nuevo probablemente se vería así:
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 laboost::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í:
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:
que puedes usar así:
fuente
std::hex
stringstream
s uno debe verificarss.good() && ss.eof()
para asegurarse de que no se produjeron errores.Para un método que funciona con C y C ++, es posible que desee considerar el uso de la función de biblioteca estándar strtol ().
fuente
strtoul
nostrtol
. Habrá+ overflow
al usar strtol. Constrtoul
no habrá desbordamiento y el valor devuelto se convertirálong
para producir el resultado correcto (-65538). Así que su respuesta es casi correcta :)Andy Buchanan, en lo que respecta a C ++, me gustó el tuyo, pero tengo algunas modificaciones:
Utilizado como
De esa manera no necesita una impl por tipo int.
fuente
Ejemplo de trabajo con
strtoul
será:strtol
conviertestring
along
. En mi computadoranumeric_limits<long>::max()
da0x7fffffff
. Obviamente eso0xfffefffe
es mayor que0x7fffffff
. Entoncesstrtol
devuelve enMAX_LONG
lugar del valor deseado.strtoul
se conviertestring
porunsigned long
eso no hay desbordamiento en este caso.Ok,
strtol
está considerando la cadena de entrada no como un entero con signo de 32 bits antes de la conversión. Muestra divertida constrtol
:El código anterior se imprime
-65538
en la consola.fuente
Aquí hay un método simple y de trabajo que encontré en otro lugar:
Tenga en cuenta que es posible que prefiera usar un entero largo sin signo / entero largo para recibir el valor. Otra nota, la función c_str () simplemente convierte el std :: string a const char *.
Entonces, si tiene listo un const char *, simplemente siga usando el nombre de esa variable directamente, como se muestra a continuación [También estoy mostrando el uso de la variable larga sin signo para un número hexadecimal más grande. No lo confunda con el caso de tener const char * en lugar de string]:
Esto funciona perfectamente bien (siempre que use los tipos de datos apropiados según sus necesidades).
fuente
Tuve el mismo problema hoy, así es como lo resolví para poder mantener lexical_cast <>
(Encontré esta página cuando estaba buscando una manera menos desagradable :-)
Saludos, A.
fuente
Esto funcionó para mí:
fuente
Prueba esto. Esta solución es un poco arriesgada. No hay cheques. La cadena solo debe tener valores hexadecimales y la longitud de la cadena debe coincidir con el tamaño del tipo de retorno. Pero no hay necesidad de encabezados adicionales.
Uso:
Nota: la longitud de la cadena debe ser divisible por 2
fuente