首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt中QChar到uint32_t的转换/转换

Qt中QChar到uint32_t的转换/转换
EN

Stack Overflow用户
提问于 2017-05-24 19:26:06
回答 2查看 1K关注 0票数 0

我有一个1500 QCharQString,我想把它转换成一个uint32_t数组。我正在读取for循环中的每个元素,并尝试将QString的每个QChar保存到uint32_t数组中。我可以通过data[i].unicode()将其转换为等效的表示形式(例如1 -> 49),但我希望在uint32_t数组形式中使用相同的字符串进行进一步处理。

代码语言:javascript
复制
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
}

有什么解决方案吗?

EN

回答 2

Stack Overflow用户

发布于 2017-05-24 20:53:08

考虑到每个行只包含16位,并且由两部分组成:单元和行,您甚至可以将两个QChar打包成一个uint32_t编号。我会用下面的方式来做:

代码语言:javascript
复制
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有一个整数,您可以编写类似的循环而不压缩,如下所示:

代码语言:javascript
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2017-05-24 21:40:46

我想在uint32_t Test[]数组中存储QString数据项。例如,如果我使用QString data = {1,'A','C',9,8,.....}作为输入,而不是输出,我希望使用uint32_t Test = {1,'A','C',9,8,.....}

这一点都不复杂。每个QChar都是uint16_t的一个薄薄的包装器。你所需要做的就是将它们转换成uint32_t,然后你就完成了。

代码语言:javascript
复制
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代码单元:

代码语言:javascript
复制
QVector<uint32_t> convert(const QString & str) {
  return str.toUcs4();
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44157012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档