hexadecimal conversion c++ decimal hex int

conversion - decimal a hexadecimal c++



Entero a cadena hexadecimal en C++ (12)

¿Cómo convierto un entero a una cadena hexadecimal en C++ ?

Puedo encontrar algunas formas de hacerlo, pero en su mayoría parecen dirigidas hacia C. No parece que haya una forma nativa de hacerlo en C ++. Sin embargo, es un problema bastante simple; Tengo un int que me gustaría convertir a una cadena hexadecimal para imprimirlo más tarde.


Código para su referencia:

#include <iomanip> ... string intToHexString(int intValue) { string hexStr; /// integer value to hex-string std::stringstream sstream; sstream << "0x" << std::setfill (''0'') << std::setw(2) << std::hex << (int)intValue; hexStr= sstream.str(); sstream.clear(); //clears out the stream-string return hexStr; }


Hago:

int hex = 10; std::string hexstring = stringFormat("%X", hex);

¡Eche un vistazo a la respuesta SO de iFreilicht y al archivo de encabezado de plantilla requerido desde aquí GIST !


La respuesta de Kornel Kisielewicz es genial. Pero una pequeña adición ayuda a detectar casos en los que llama a esta función con argumentos de plantilla que no tienen sentido (por ejemplo, float) o que daría lugar a errores del compilador desordenados (por ejemplo, tipo definido por el usuario).

template< typename T > std::string int_to_hex( T i ) { // Ensure this function is called with a template parameter that makes sense. Note: static_assert is only available in C++11 and higher. static_assert(std::is_integral<T>::value, "Template argument ''T'' must be a fundamental integer type (e.g. int, short, etc..)."); std::stringstream stream; stream << "0x" << std::setfill (''0'') << std::setw(sizeof(T)*2) << std::hex << i; // Optional: replace above line with this to handle 8-bit integers. // << std::hex << std::to_string(i); return stream.str(); }

He editado esto para agregar una llamada a std :: to_string porque los tipos enteros de 8 bits (por ejemplo, std::uint8_t values ​​passed) to std::stringstream se tratan como char, lo que no le da el resultado que desea. Pasar dichos enteros a std::to_string maneja correctamente y no daña las cosas cuando se usan otros tipos enteros más grandes. Por supuesto, es posible que sufra un ligero golpe de rendimiento en estos casos, ya que la llamada std :: to_string es innecesaria.

Nota: Acabo de agregar esto en un comentario a la respuesta original, pero no tengo el representante para comentar.


Para aquellos de ustedes que descubrieron que muchos / la mayoría de los ios::fmtflags no funcionan con std::stringstream como la idea de la plantilla que Kornel publicó mucho tiempo atrás, lo siguiente funciona y está relativamente limpio:

#include <iomanip> #include <sstream> template< typename T > std::string hexify(T i) { std::stringbuf buf; std::ostream os(&buf); os << "0x" << std::setfill(''0'') << std::setw(sizeof(T) * 2) << std::hex << i; return buf.str().c_str(); } int someNumber = 314159265; std::string hexified = hexify< int >(someNumber);


Para que sea más ligero y rápido, sugiero usar relleno directo de una cuerda.

template <typename I> std::string n2hexstr(I w, size_t hex_len = sizeof(I)<<1) { static const char* digits = "0123456789ABCDEF"; std::string rc(hex_len,''0''); for (size_t i=0, j=(hex_len-1)*4 ; i<hex_len; ++i,j-=4) rc[i] = digits[(w>>j) & 0x0f]; return rc; }


Prueba esto:

#include<iostream> using namespace std; int main() { int *a = new int;//or put a number exept new int //use * for pointer cin >> *a; cout << a; //if integer that is made as pointer printed without *, than it will print hex value return 0; //I hope i help you }


Puedes probar lo siguiente. Esta funcionando...

#include <iostream> #include <fstream> #include <string> #include <sstream> using namespace std; template <class T> string to_string(T t, ios_base & (*f)(ios_base&)) { ostringstream oss; oss << f << t; return oss.str(); } int main () { cout<<to_string<long>(123456, hex)<<endl; system("PAUSE"); return 0; }


Simplemente imprímalo como un número hexadecimal:

int i = /* ... */; std::cout << std::hex << i;


Solo eche un vistazo a mi solución, [1] que literalmente copié de mi proyecto, por lo que hay un documento de API de alemán incluido. Mi objetivo era combinar flexibilidad y seguridad dentro de mis necesidades reales: [2]

  • no se agregó el prefijo 0x : el que llama puede decidir
  • deducción automática del ancho : menos tipeo
  • control de ancho explícito : ensanchamiento para formatear, (sin pérdida) encogimiento para ahorrar espacio
  • capaz de hacer frente a long long
  • restringido a tipos integrales : evitar sorpresas por conversiones silenciosas
  • facilidad de comprensión
  • sin límite codificado

#include <string> #include <sstream> #include <iomanip> /// Vertextet einen Ganzzahlwert val im Hexadezimalformat. /// Auf die Minimal-Breite width wird mit führenden Nullen aufgefüllt; /// falls nicht angegeben, wird diese Breite aus dem Typ des Arguments /// abgeleitet. Funktion geeignet von char bis long long. /// Zeiger, Fließkommazahlen u.ä. werden nicht unterstützt, ihre /// Übergabe führt zu einem (beabsichtigten!) Compilerfehler. /// Grundlagen aus: http://.com/a/5100745/2932052 template <typename T> inline std::string int_to_hex(T val, size_t width=sizeof(T)*2) { std::stringstream ss; ss << std::setfill(''0'') << std::setw(width) << std::hex << (val|0); return ss.str(); }

[1] basado en la respuesta de Kornel Kisielewicz
[2] Traducido al lenguaje de CppTest , así es como se lee:

TEST_ASSERT(int_to_hex(char(0x12)) == "12"); TEST_ASSERT(int_to_hex(short(0x1234)) == "1234"); TEST_ASSERT(int_to_hex(long(0x12345678)) == "12345678"); TEST_ASSERT(int_to_hex((long long)(0x123456789abcdef0)) == "123456789abcdef0"); TEST_ASSERT(int_to_hex(0x123, 1) == "123"); TEST_ASSERT(int_to_hex(0x123, 8) == "00000123");


Use <iomanip> ''s std::hex . Si imprime, solo envíelo a std::cout , si no, use std::stringstream

std::stringstream stream; stream << std::hex << your_int; std::string result( stream.str() );

Puede anteponer el primer << con << "0x" o lo que quiera si lo desea.

Otros manípulos de interés son std::oct (octal) y std::dec (de nuevo a decimal).

Un problema que puede encontrar es el hecho de que esto produce la cantidad exacta de dígitos necesarios para representarlo. Puede usar setfill y setw para eludir el problema:

stream << std::setfill (''0'') << std::setw(sizeof(your_type)*2) << std::hex << your_int;

Entonces, finalmente, sugeriría tal función:

template< typename T > std::string int_to_hex( T i ) { std::stringstream stream; stream << "0x" << std::setfill (''0'') << std::setw(sizeof(T)*2) << std::hex << i; return stream.str(); }


Utilice std::stringstream para convertir enteros en cadenas y sus manipuladores especiales para establecer la base. Por ejemplo, así:

std::stringstream sstream; sstream << std::hex << my_integer; std::string result = sstream.str();


int num = 30; std::cout << std::hex << num << endl; // This should give you hexa- decimal of 30