у меня есть 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
}
Какие-либо решения?
Принимая во внимание, что каждый 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;
}
Я хочу хранить вещи
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();
}
Обратите внимание, что кодовая точка и кодовая единица имеют определенные значения и не синонимы.