Convertir cadenas entre formato hexadecimal y formato binario.

¿Existe alguna utilidad o biblioteca que proporcione una función simple para convertir una cadena entre formato hexadecimal / binario? He estado buscando en SO y actualmente uso el enfoque de tabla de consulta. Por cierto, ya que podría ser una cadena larga, no consideraría convertir la cadena en entero y procesar la conversión de formato, ya que una cadena larga podría ser mayor que MAX_INT (u otros tipos de datos enteros).

Por ejemplo:

0xA1 => 10100001 11110001 => 0xF1 

PD: mi proyecto está usando Boost 1.44, un poco anticuado. Entonces, si la utilidad es de Boost, esperamos que esté disponible en 1.44.

Puede usar una combinación de std::stringstream , std::hex y std::bitset para convertir entre hexadecimal y binario en C ++ 03.

Aquí hay un ejemplo:

 #include  #include  #include  #include  using namespace std; int main() { string s = "0xA"; stringstream ss; ss << hex << s; unsigned n; ss >> n; bitset<32> b(n); // outputs "00000000000000000000000000001010" cout << b.to_string() << endl; } 

EDITAR:

Acerca de la pregunta refinada, aquí hay un ejemplo de código sobre la conversión entre cadenas hexadecimales y cadenas binarias (puede refactorizar con una función auxiliar para la parte de bits de caracteres hex <> y usar un mapa o un interruptor, etc.).

 const char* hex_char_to_bin(char c) { // TODO handle default / error switch(toupper(c)) { case '0': return "0000"; case '1': return "0001"; case '2': return "0010"; case '3': return "0011"; case '4': return "0100"; case '5': return "0101"; case '6': return "0110"; case '7': return "0111"; case '8': return "1000"; case '9': return "1001"; case 'A': return "1010"; case 'B': return "1011"; case 'C': return "1100"; case 'D': return "1101"; case 'E': return "1110"; case 'F': return "1111"; } } std::string hex_str_to_bin_str(const std::string& hex) { // TODO use a loop from  or smth std::string bin; for(unsigned i = 0; i != hex.length(); ++i) bin += hex_char_to_bin(hex[i]); return bin; } 

El siguiente código incluye dos funciones que harán exactamente lo que usted desea. Esto se basa en la respuesta de Silex, pero con algunas operaciones de cadena adicionales para coincidir con la salida de ejemplo que dio en su pregunta.

 #include  #include  #include  #include  #include  using namespace std; const unsigned g_unMaxBits = 32; string Hex2Bin(const string& s) { stringstream ss; ss << hex << s; unsigned n; ss >> n; bitset b(n); unsigned x = 0; if (boost::starts_with(s, "0x") || boost::starts_with(s, "0X")) x = 2; return b.to_string().substr(32 - 4*(s.length()-x)); } string Bin2Hex(const string& s) { bitset bs(s); unsigned n = bs.to_ulong(); stringstream ss; ss << hex << n; return "0x" + boost::to_upper_copy(ss.str()); } int main() { cout << "0xA1 => " << Hex2Bin("0xA1") << endl; cout << "B3 => " << Hex2Bin("B3") << endl; cout << "11110001 => " << Bin2Hex("11110001") << endl; return 0; } 

La solución más simple sin usar el conjunto de bits o cualquier biblioteca, solo usar los operadores de cambio y std :: hex para convertir toda la cadena hexadecimal .

Código de ejemplo para convertir una cadena hexadecimal en dígitos binarios:

 string s = "FF 0F F0 C3 10"; stringstream ss; ss << hex << s; unsigned int n; while(ss >> n){ for (int i = 8 -1; i >= 0; i--) cout << ((n >> i) & 1) ? "1" : "0"; cout << std::endl; } 

salida de muestra:

 11111111 00001111 11110000 11000011 00001010 

código completo de snipet