QChar в uint32_t преобразование / приведение в Qt

У меня есть QString 1500 QChar который я хочу преобразовать в массив uint32_t, Я читаю каждый элемент для цикла и пытаюсь сохранить каждый QChar из QString в 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
}

Какие-либо решения?

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

Обратите внимание, что кодовая точка и кодовая единица имеют определенные значения и не являются синонимами.

Принимая во внимание, что каждый 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;
}
Другие вопросы по тегам