2016-05-08 51 views
0

有什麼辦法來構建從十六進制std::stringQString,反之亦然一個std::bitset而不執行二進制移位操作?我知道如何做到這一點,但我想知道是否有可能使用C++流或類似的東西來做到這一點。從一個std創建的std :: bitset的或QBitArray ::字符串或QString的含有十六進制數字

這裏是我到目前爲止的代碼(試圖避免在主持人的火來):

QString data("aabbccddeeff"); 
QByteArray temp = QByteArray::fromHex(data.simplified().toLatin1()); 
QBitArray bits(temp.count()*8); 
for(int i=0; i<temp.count(); ++i) { 
    for(int b=0; b<8;b++) { 
     bits.setBit(i*8+b, temp.at(i)&(1<<(7-b))); 
    } 
} 
+0

結果位的最大長度是多少?它是否比您的平臺上最寬的整數更長? –

+0

@JohnZwinck它的128位或16字節最大。 – Barracuda

回答

1

您可以在十六進制字符串轉換爲一個整體,構建從一個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; 
} 
+0

'ss >> n'將用'ss << hex << s'行將提供給'ss'的字符的ascii值初始化爲'n'。 – Barracuda

0

基於由Trevor下面提供的答案,我寫了下面的代碼:

std::vector<std::bitset<8ul> > Bytes2Bits(QByteArray bytes) 
{ 
    std::vector<std::bitset<8ul> > v; 
    for(int i = 0 ; i < bytes.size(); ++i) 
    { 
     QByteArray temp; 
     temp.append(bytes.at(i)); 
     std::string s = temp.toHex().toStdString(); 
     std::stringstream ss; 
     ss << s; 
     int n; 
     ss >> n; 
     std::bitset<8ul> b(n); 
     v.push_back(b); 
    } 
    return v; 
} 

我希望這是給別人尋求相同的解決方案是有用的。

0

這個怎麼樣?

std::string str("deadBEEF"); 
std::bitset<128> bits; // result 

char* raw = reinterpret_cast<char*>(&bits) + sizeof(bits) - 1; // last byte           
assert(str.size() <= 2 * sizeof(bits)); 

for (size_t ii = 0; ii < str.size(); ++ii) { 
    char ch = str[ii]; 

    if (ch >= '0' && ch <= '9') { 
     ch -= '0'; 
    } else if (ch >= 'a' && ch <= 'f') { 
     ch -= 'a' - 10; 
    } else if (ch >= 'A' && ch <= 'F') { 
     ch -= 'A' - 10; 
    } else { 
     throw std::runtime_error("invalid input"); 
    } 

    if (ii % 2 == 0) { 
     ch <<= 4; // nibble                       
    } 

    *raw |= ch; 

    if (ii % 2) { 
     --raw; 
    } 
} 

cout << bits << endl; 

上面假定一個std::bitset有且只有一個數據成員:大到足以容納的比特數模板整數數組。我認爲這是一個公平的假設,但它肯定不能保證便攜。好消息是它會很快 - 部分原因是它沒有動態內存分配。

相關問題