QChar
содержит ushort
в качестве единственного члена, поэтому его размер равен sizeof(ushort)
.
В контексте QString
он представляет UTF-16 «символы» (кодовые точки).
Так что здесь все дело в кодировании.
Если вы знаете, что ваши char const *
это UTF-16 данные в том же порядке байтов / байтов, что и ваша система, просто скопируйте их:
memcpy(q, c, 512);
Если вы хотите инициализировать QString
с вашими данными const char *
, вы можете просто интерпретировать его как UTF-16, используя QString::fromRawData()
:
QString strFromData = QString::fromRawData(reinterpret_cast<QChar*>(c), 256);
// where 256 is sizeof(c) * sizeof(char) / sizeof(QChar)
Тогда вам даже не нужен массив QChar q[256]
.
Если вы знаете, что ваши данные UTF-8 , вы должны использовать QString::fromUtf8()
, а затем просто получить доступ к его внутреннемупамять с QString::constData()
.
Использование QString
с UTF-8 Я не знаю ни одного метода, который бы полностью предотвращал выделение кучи.Но упомянутый способ должен распределяться только дважды: один раз для PIMPL QString
, один раз для строковых данных UTF-16.
Если ваши входные данные закодированы как UTF-8
, ответ будет Нет : Вы не можете конвертировать его, используя Qt.
Доказательство: Глядя на исходный код qtbase / src / corelib / codecs / qutfcodec.cpp , мы видим, что всефункции для кодирования / декодирования создают новые QString
/ QByteArray
экземпляры.Ни одна функция не работает с двумя массивами, как в вашем вопросе.