2013-08-19 22 views
9

16進形式とバイナリ形式の間で文字列を変換するための簡単な関数はありますか?私はSOで検索していて、現在ルックアップテーブルアプローチを使用しています。ところで、長い文字列である可能性があるので、長い文字列はMAX_INT(または他の整数データ型)よりも大きい可能性があるため、文字列を整数に変換してフォーマット変換を処理することは考慮しません。例えば16進形式とバイナリ形式の間の文字列を変換する

0xA1 => 10100001 
11110001 => 0xF1 

PS:私のプロジェクトはブースト1.44、時代遅れのビットを使用しています。したがって、ユーティリティがBoostからのものであれば、うまくいけば1.44で利用可能です。

+2

どのような「16進/ 2進形式」ですか?いくつかの例を与えるためにケア? –

答えて

16

C++ 03では、std::stringstream,std::hexおよびstd::bitsetの組み合わせを使用して、16進数と2進数の間の変換を行うことができます。ここで

は例です:

#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:洗練された質問について

が、ここでは進文字列とバイナリ文字列の間の変換についてのコード例です(あなたが進文字のためのヘルパー関数をリファクタリングすることができます<>ビット部分を使用し、代わりに地図やスイッチなどを使用します)。

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

unsigned nの宣言を変更する必要があります。符号なしlong long n; (はい、その2つの長さ) – BuvinJ

5

次のコードには、希望どおりに機能する2つの機能が含まれています。これはSilexの答えに基づいていますが、あなたの質問に与えた出力の例と一致させるためにいくつかの余分な文字列操作を加えています。

#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; 
} 
関連する問題