0

我有QString1500个QChar,我想将其转换为uint32_t. 我正在读取 for 循环中的每个元素并尝试将每个元素保存QCharQString数组uint32_t中。我可以通过将其转换为等效的表示形式(例如 1 -> 49),data[i].unicode()但我希望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
}

有什么解决办法吗?

4

2 回答 2

0

考虑到每个QChar仅包含 16 位并由两部分组成:单元格和行,您甚至可以将两个QChars 打包成一个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;
}
于 2017-05-24T12:53:08.083 回答
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();
}

请注意,代码点和代码单元具有特定含义,并且不是同义词。

于 2017-05-24T13:40:46.230 回答