【问题标题】:create std::bitset or QBitArray from a std::string or QString containing hexadecimal numbers从包含十六进制数字的 std::string 或 QString 创建 std::bitset 或 QBitArray
【发布时间】:2016-09-03 05:03:28
【问题描述】:

有没有办法从十六进制的std::stringQString 构造一个std::bitset,反之亦然,而无需执行二进制移位操作?我知道如何做到这一点,但我想知道是否可以使用 C++ 流或类似的东西来做到这一点。

这是我目前的代码(尽量避免受到版主的抨击):

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

【问题讨论】:

  • 得到的位的最大长度是多少?它是否比您平台上最宽的整数长?
  • @JohnZwinck 最多 128 位或 16 字节。

标签: c++ data-conversion qstring qbytearray std-bitset


【解决方案1】:
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;
}

【讨论】:

  • 请解释如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。
  • 添加一些解释可能有助于我们更好地理解编写的代码。
【解决方案2】:

这个怎么样?

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 仅具有一个数据成员:一个整数数组,其大小足以容纳模板化的位数。我认为这是一个公平的假设,但肯定不能保证它是可移植的。好消息是它会很快——部分原因是它没有动态内存分配。

【讨论】:

    【解决方案3】:

    根据 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;
    }
    

    我希望它对寻求相同解决方案的其他人有用。

    【讨论】:

      【解决方案4】:

      您可以将十六进制字符串转换为整数,并从中构造一个位集。

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

      【讨论】:

      • ss &gt;&gt; n 将使用ss &lt;&lt; hex &lt;&lt; s 行提供给ss 的字符的ascii 值初始化n
      猜你喜欢
      • 1970-01-01
      • 2014-10-30
      • 2011-08-24
      • 2022-06-22
      • 2013-07-07
      • 1970-01-01
      • 2011-06-08
      • 2020-02-09
      • 2012-11-09
      相关资源
      最近更新 更多