2013-08-19 76 views
9

Có tiện ích hoặc thư viện nào cung cấp chức năng đơn giản để chuyển đổi chuỗi giữa định dạng nhị phân/nhị phân không? Tôi đã tìm kiếm trên SO và hiện đang sử dụng phương pháp tiếp cận bảng tra cứu. Nhân tiện, vì nó có thể là một chuỗi dài, tôi sẽ không xem xét chuyển chuỗi thành số nguyên và xử lý chuyển đổi định dạng, vì chuỗi dài có thể lớn hơn MAX_INT (hoặc các kiểu dữ liệu số nguyên khác).Chuyển đổi chuỗi giữa định dạng thập phân và định dạng nhị phân

Ví dụ:

0xA1 => 10100001 
11110001 => 0xF1 

PS: Dự án của tôi đang sử dụng Boost 1,44, một chút out-ngày. Vì vậy, nếu tiện ích là từ Boost, hy vọng nó có sẵn trong 1,44.

+2

Loại "hex/định dạng nhị phân" nào? Chăm sóc để đưa ra một số ví dụ? –

Trả lời

16

Bạn có thể sử dụng kết hợp std::stringstream, std::hexstd::bitset để chuyển đổi giữa hex và nhị phân trong C++ 03.

Dưới đây là một ví dụ:

#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:

Giới thiệu về câu hỏi tinh tế, đây là một ví dụ mã về chuyển đổi giữa các chuỗi hex và chuỗi nhị phân (bạn có thể cấu trúc lại với một hàm helper cho hex char <> bit một phần và sử dụng bản đồ hoặc công tắc thay thế, v.v ...).

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

Bạn có thể cần phải thay đổi khai báo unsigned n; để unsigned dài dài n; (Có, hai thời gian dài trong đó) – BuvinJ

5

Mã sau bao gồm hai chức năng sẽ thực hiện chính xác như bạn mong muốn. Điều này dựa trên câu trả lời của Silex nhưng với một vài hoạt động chuỗi bổ sung để phù hợp với kết quả ví dụ bạn đã đưa ra trong câu hỏi của bạn.

#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; 
} 
Các vấn đề liên quan