【问题标题】:QChar to uint32_t conversion / casting in QtQChar 到 uint32_t 在 Qt 中的转换/铸造
【发布时间】:2017-05-24 11:26:06
【问题描述】:

我有 1500 个 QCharQString,我想将其转换为 uint32_t 的数组。我正在读取 for 循环中的每个元素,并尝试将每个 QCharQString 保存到 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
}

有什么解决办法吗?

【问题讨论】:

  • uint16_t 不是很适合这种转换的数据类型吗?请注意,QChar 代表 16 位。
  • 你想在 uint32 中保存什么?作为 UTF8、UTF16 还是 UTF32?此外,引用 QT 网站:“QChar 类提供 16 位 Unicode 字符。”
  • 我想把它保存为 uint32_t。转换后,我将把它传递给另一个只接受 uint32_t 类型数组的函数。可以使用data.toUInt(nullptr,16) 将 8 个 QChars 的 Qstring 转换为 uint32_t 类型,但由于我的字符串很长,我需要分别处理每个单独的项目。
  • 请编辑问题以描述您对 convert 一词的含义。这个词本身几乎没有意义。 string.toUInt(...) 是一种将数字的文本表示形式转换为整数的方法,例如Q_ASSERT(QStringLiteral("789ABC").toUint({},16) == 0x789ABC)。至少,请提供一些转换示例,声明为您寻求并打算持有的某些convert 函数的断言。这是指定您希望 convert 函数执行的操作的好方法。
  • 我想将QString data 的项目存储在uint32_t Test[] 数组中。例如。如果我有QString data = {1,'A','C',9,8,.....} 作为输入而不是输出我想要uint32_t Test = {1,'A','C',9,8,.....}

标签: c++ qt casting qstring qchar


【解决方案1】:

考虑到每个 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;
}

【讨论】:

    【解决方案2】:

    我想将 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();
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 2017-08-12
      • 2014-11-28
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多