从包含十六进制数字的std::string或QString创建std::bitset或QBitArray
create std::bitset or QBitArray from a std::string or QString containing hexadecimal numbers
是否有任何方法可以在不执行二进制移位操作的情况下从十六进制std::string
或QString
构造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)) );
}
}
您可以将十六进制字符串转换为整数,并从中构造一个位集。
#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;
}
根据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::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
只有一个数据成员:一个足够大的整数数组,可以容纳模板化的位数。我认为这是一个合理的假设,但肯定不能保证它是可移植的。好消息是它会很快——部分原因是它不进行动态内存分配。
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;
}
相关文章:
- Strange behavior of std::vector<{QString,int*}>
- 错误:移动文件时'QString'为非标量类型"std::__cxx11::字符串"
- 我可以使用模板在 QString 和 std::string 之间进行自动转换吗?
- 如何将STD :: String转换为QString保留值,反之亦然
- QString to std::string Unicode trouble
- 从包含十六进制数字的std::string或QString创建std::bitset或QBitArray
- QString to std::string
- advantage of QString over std::string
- 正在将QString转换为std::string
- 有效地比较QString和std::string是否相等
- QByteArray to QString to std::stringstream 不起作用
- 将QString/std::字符串转换为QImage
- QString到std::string到const char*的转换在赋值中不起作用
- QT:尝试在std::pair中存储QString时出错
- QT5.7 -为什么我得到一个畸形的json值与QString,但完美与std::string.< / h1 &g
- 将QString转换为std::string*
- 将std::string转换为QString
- 如何将' std::string '传递给' QString ' ' arg '方法
- 参数中QString与std::string冲突
- QString和stdstring组合在std::编译错误中不起作用