2013-08-19 19 views
9

Herhangi bir yardımcı program veya kitaplık, bir dizeyi onaltılık/ikili biçim arasında dönüştürmek için basit bir işlev sunuyor mu? SO üzerinde arama yapıyordum ve şu anda look-up tablo yaklaşımını kullanıyordum. Bu arada, uzun bir dize olabileceğinden, dizeyi tamsayıya dönüştürmeyi ve biçim dönüştürmeyi işleme koymayı düşünmüyordum, çünkü uzun bir dize MAX_INT (veya diğer tamsayı veri türleri) 'den büyük olabilir. ÖrneğinDizeleri altıgen biçimiyle ikili biçim arasında dönüştürme

:

0xA1 => 10100001 
11110001 => 0xF1 

PS: Projem Boost 1,44 kullanıyor, out tarihli biraz. Yani, yardımcı program, Boost'tan geliyorsa, umarım 1.44'te kullanılabilir.

+2

Ne tür "hex/ikili format"? Bir örnek vermek ister misiniz? –

cevap

16

C++ 03'te onaltılık ve ikili arasında dönüştürme yapmak için std::stringstream, std::hex ve std::bitset bir arada kullanabilirsiniz.

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

DÜZENLEME: İşte

bir örnek rafine soruya Hakkında

, burada altıgen dizeleri ve ikili dizeleri arasında dönüştürme hakkında bir kod örneği (eğer altıgen Char için bir yardımcı fonksiyonu ile planı ayrı <> bit parçası ve bunun yerine bir harita veya anahtar kullanın, vb.).

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

İmzasız n beyanını değiştirmeniz gerekebilir; imzasız uzun uzun n; (Evet, iki uzun) – BuvinJ

5

Aşağıdaki kod, tam olarak istediğiniz gibi yapacak iki işlevi içerir. Bu, Silex'in cevabına dayanıyor, ancak sorunuzda verdiğiniz örnek çıktıyla eşleştirmek için birkaç ekstra string işlemiyle.

#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; 
} 
İlgili konular