C++ 从包含十六进制数的std::string或QString创建std::bitset或QBitArray

C++ 从包含十六进制数的std::string或QString创建std::bitset或QBitArray,c++,data-conversion,qstring,qbytearray,std-bitset,C++,Data Conversion,Qstring,Qbytearray,Std Bitset,是否有任何方法可以从十六进制std::string或QString构造std::bitset,反之亦然,而无需执行二进制移位操作?我知道如何做到这一点,但我想知道是否有可能使用C++流或类似的东西来做这件事。 以下是我迄今为止的代码(试图避免遭到版主的抨击): QString数据(“aabbccddeeff”); QByteArray temp=QByteArray::fromHex(data.simplified().toLatin1()); QBitArray位(临时计数()*8); 对于(

是否有任何方法可以从十六进制
std::string
QString
构造
std::bitset
,反之亦然,而无需执行二进制移位操作?我知道如何做到这一点,但我想知道是否有可能使用C++流或类似的东西来做这件事。 以下是我迄今为止的代码(试图避免遭到版主的抨击):

QString数据(“aabbccddeeff”);
QByteArray temp=QByteArray::fromHex(data.simplified().toLatin1());
QBitArray位(临时计数()*8);

对于(inti=0;i,可以将十六进制字符串转换为整数,并由此构造位集

#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
字符串s=“0xA”;
细流ss;
ss n;
位集b(n);
//输出“000000000000000000000001010”

cout根据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;
}
std::向量字节2位(QByteArray字节)
{
std::向量v;
对于(int i=0;in;
std::位集b(n);
v、 推回(b);
}
返回v;
}
我希望它对寻求相同解决方案的其他人有用。

这个怎么样

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::string str(“死牛肉”);
std::位集位;//结果
char*raw=reinterpret\u cast(&bits)+sizeof(bits)-1;//最后一个字节
断言(str.size()='0'&&ch='a'&&ch='a'&&ch
QBitArray位转换器::GetBits(quint64值,布尔lsb)
{
QString二进制;
setNum(值,2);
QBitArray位(binary.count());
如果(lsb)
{
对于(int i=0;i=0;i--,j++)
{
位[j]=二进制[i]='1';
}
}
返回位;
}

结果位的最大长度是多少?它比平台上最宽的整数长吗?@JohnZwinck它的最大长度是128位或16字节。
ss>>n
将使用行
ss
提供给
ss
的字符的ascii值初始化
n
。请说明这是如何解决问题的,以及原因这确实有助于提高您的文章质量,并可能导致更多的投票。添加一些解释可能有助于我们更好地理解编写的代码。
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;
QBitArray BitConverter::GetBits(quint64 value, bool lsb)
{
    QString binary;
    binary.setNum(value, 2);

    QBitArray bits(binary.count());
    if (lsb)
    {
        for (int i = 0; i < binary.count(); i++)
        {
            bits[i] = binary[i] == '1';
        }
    }
    else
    {
        for (int i = binary.count() - 1, j = 0; i >= 0; i--, j++)
        {
            bits[j] = binary[i] == '1';
        }
    }
    return bits;
}