2013-08-19 16 views
9

C'è qualche utilità o libreria fornisce una semplice funzione per convertire una stringa tra il formato hex/binario? Ho cercato su SO e attualmente utilizzo l'approccio alla tabella di ricerca. A proposito, dato che potrebbe essere una stringa lunga, non prenderei in considerazione la conversione della stringa in numero intero e l'elaborazione della conversione del formato, poiché una stringa lunga potrebbe essere maggiore di MAX_INT (o altri tipi di dati interi).Converti stringhe tra il formato esadecimale e il formato binario

Ad esempio:

0xA1 => 10100001 
11110001 => 0xF1 

PS: Il mio progetto sta usando Boost 1,44, un po 'fuori-datato. Quindi, se l'utilità è da Boost, si spera che sia disponibile in 1.44.

+2

Che tipo di "formato esadecimale/binario"? Ti va di dare qualche esempio? –

risposta

16

È possibile utilizzare una combinazione di std::stringstream, std::hex e std::bitset per convertire tra hex e binario in C++ 03.

Ecco un esempio:

#include <iostream> 
#include <sstream> 
#include <bitset> 
#include <string> 

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; 
} 

EDIT:

sulla questione raffinato, ecco un esempio di codice sulla conversione tra stringhe esadecimali e stringhe binarie (si può refactoring con una funzione di supporto per il carattere hex <> parte dei bit, e utilizzare invece una mappa o uno switch, ecc.).

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 <algorithm> or smth 
    std::string bin; 
    for(unsigned i = 0; i != hex.length(); ++i) 
     bin += hex_char_to_bin(hex[i]); 
    return bin; 
} 
+1

Potrebbe essere necessario modificare la dichiarazione unsigned n; a non firmato lungo lungo n; (Sì, due lunghi in quello) – BuvinJ

5

Il seguente codice include due funzioni che verranno eseguite esattamente come desiderato. Questo è basato sulla risposta di Silex ma con alcune operazioni di stringa aggiuntive per abbinare l'output di esempio che hai fornito nella tua domanda.

#include <iostream> 
#include <sstream> 
#include <bitset> 
#include <string> 
#include <boost/algorithm/string.hpp> 

using namespace std; 

const unsigned g_unMaxBits = 32; 

string Hex2Bin(const string& s) 
{ 
    stringstream ss; 
    ss << hex << s; 
    unsigned n; 
    ss >> n; 
    bitset<g_unMaxBits> 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<g_unMaxBits> 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; 
} 
Problemi correlati