13

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

例えば:

0xA1 => 10100001
11110001 => 0xF1

PS: 私のプロジェクトは、少し古い Boost 1.44 を使用しています。そのため、ユーティリティが Boost のものである場合は、1.44 で利用できることを願っています。

4

5 に答える 5

28

との組み合わせを使用してstd::stringstream、C++03 で 16 進数と 2 進数を変換できます。std::hexstd::bitset

次に例を示します。

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

編集:

洗練された質問については、16 進数文字列とバイナリ文字列間の変換に関するコード例を次に示します (16 進数の char<>bits 部分のヘルパー関数を使用してリファクタリングし、代わりにマップまたはスイッチを使用するなど)。

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;
}
于 2013-08-19T10:01:48.790 に答える
1

プレーンなc++ 11で簡潔なソリューションが必要な場合。どうぞ:

string hextobin(const string &s){
    string out;
    for(auto i: s){
        uint8_t n;
        if(i <= '9' and i >= '0')
            n = i - '0';
        else
            n = 10 + i - 'A';
        for(int8_t j = 3; j >= 0; --j)
            out.push_back((n & (1<<j))? '1':'0');
    }

    return out;
}

string bintohex(const string &s){
    string out;
    for(uint i = 0; i < s.size(); i += 4){
        int8_t n = 0;
        for(uint j = i; j < i + 4; ++j){
            n <<= 1;
            if(s[j] == '1')
                n |= 1;
        }

        if(n<=9)
            out.push_back('0' + n);
        else
            out.push_back('A' + n - 10);
    }

    return out;
}

これは、パディングを必要とせずに、任意の長さの文字列に対して機能します。長いスイッチケースがなく、ビット操作が高速であるため、かなり高速になるはずです。

使用例:

string s = "FF11";
string b = hextobin(s);
cout << b << endl; // prints 1111111100010001
string h = bintohex(b);
cout << h << endl; // prints FF11
于 2019-01-27T08:07:02.273 に答える