我有一个QString
1500 QChar
,我想将其转换为uint32_t
数组。我正在阅读for循环中的每个元素,并尝试将每个QChar
QString
保存到uint32_t
数组。我可以通过data[i].unicode()
将其转换为等效表示形式(例如1 - > 49),但我想要uint32_t
数组形式的相同字符串进行进一步处理。
QString data = {1,'A','C',9,8,.....};
uint32_t Test[data.length()] = {0};
for (uint32_t i =0; i<data.length(); i++) {
Test[i] = data[i]; // here i need QChar to uint32_t conversion
}
任何解决方案?
答案 0 :(得分:0)
考虑到每个QChar
只包含16位并由两部分组成:单元格和行,您甚至可以将两个QChar
打包成一个uint32_t
个数字。我会用以下方式做到这一点:
QString data("ABCDE");
std::vector<uint32_t> test((data.count() + 1) / 2, 0);
for (int i = 0; i < data.length(); ++i)
{
const QChar &c = data[i];
uchar cell = c.cell();
uchar row = c.row();
uint32_t &ui32 = test[i / 2];
if (i % 2 == 0)
{
ui32 = cell;
}
else
{
ui32 <<= 8;
ui32 |= cell;
}
ui32 <<= 8;
ui32 |= row;
}
但是,如果你仍然需要每个QChar
有一个整数,你可以编写类似的循环而不需要压缩,如:
QString data("ABCDE");
std::vector<uint32_t> test(data.count(), 0);
for (int i = 0; i < data.length(); ++i)
{
const QChar &c = data[i];
uchar cell = c.cell();
uchar row = c.row();
uint32_t &ui32 = test[i];
ui32 = cell;
ui32 <<= 8;
ui32 |= row;
}
答案 1 :(得分:0)
我想在
QString
数组中存储uint32_t Test[]
个数据项。例如。如果我输入QString data = {1,'A','C',9,8,.....}
而不是输出,我希望uint32_t Test = {1,'A','C',9,8,.....}
这根本不复杂。每个QChar
都是uint16_t
周围的薄包装。您需要做的就是将这些转换为uint32_t
,然后就完成了。
QVector<uint32_t> convert(const QString & str) {
QVector<uint32_t> output;
output.reserve(str.size());
for (auto c : str)
output.append(c.unicode());
return output;
}
void user(const uint32_t *, size_t size);
void test(const QString & str) {
auto const data = convert(str);
user(data.data(), size_t(data.size());
}
当然,您可能对uint32_t
的含义有错误的假设。上面的代码假定user
需要UTF16代码单元。但是,user
更有可能期望UTF32代码单元,即每个uint32_t
代表一个Unicode代码点。
在后一种情况下,您必须将UTF16代码单元的共轭对转换为单个UTF32代码单元:
QVector<uint32_t> convert(const QString & str) {
return str.toUcs4();
}
请注意,代码点和代码单元具有特定含义,并且不是同义词。