Как преобразовать массив в QByteArray? - PullRequest
0 голосов
/ 06 декабря 2011

Я хотел бы преобразовать массив в QByteArray в Qt. Может кто-нибудь объяснить концепцию? Пожалуйста, приведите пример.

Ответы [ 3 ]

3 голосов
/ 06 декабря 2011

QByteArray имеет конструктор , который делает именно это.

Вот как это использовать:

const char* data; int size; // these variables should be correctly set to your array and size
QByteArray ba(data, size);

Я использовал указатель для данных, но массивы распадаются на указатели при передаче в качестве параметров, так что это то же самое. Этот конструктор сделает глубокую копию данных. Это означает, что он станет владельцем только той копии, которую он делает, и данные, которые вы использовали, могут быть освобождены, если они были выделены динамически.

Для массивов других типов, отличных от char, вы по существу выполняете сериализацию:

int data[30];

for (int i = 0; i < 30; ++i)
{
    ba.append((const char*)(data + i), sizeof(int));
}

Приведенный выше код вставит байты, составляющие ваши целые, в QByteArray. Однако будьте осторожны, поскольку на этом этапе индексирование QByteArray не возвращает целые числа, а байты, из которых они сделаны.

Чтобы преобразовать QString (это не то, что вы просили, а добавил комментарий, запрашивающий его), используйте одну из соответствующих функций-членов QString:

QByteArray ba = str.toLocal8bit();
QByteArray ba2 = str.toLatin1();
QByteArray ba3 = str.toUtf8();
QByteArray ba4 = str.toAscii();

Чтобы решить, какой из них использовать, вы должны знать кодировку вашей строки. Для преобразования между кодировками используйте QTextCodec

0 голосов
/ 30 октября 2015

Для хранения массива в QByteArray я адаптировал метод, описанный здесь: http://smartqt.blogspot.ru/2014/05/how-to-convert-struct-in-and-from.html

Моя версия для массива int:

QByteArray serialize(int* ar, int ar_size)
{
    QByteArray result;
    QDataStream stream (&result, QIODevice::WriteOnly);
    stream<<ar_size;

    for (int i=0; i<ar_size; i++)
        stream<<ar[i];

    return result;
}

void deserialize(const QByteArray& byteArray)
{
    QDataStream stream(byteArray);
    int ar_size=0;
    stream>>ar_size;    
    int* ar = new int[ar_size];

    for (int i=0; i<ar_size;i++)
        stream>>ar[i];
}

Ура!

0 голосов
/ 06 декабря 2011

Массив чего? Предполагая, что вы имеете в виду массив символов с нулевым символом в конце:

#include <QtCore>
int main(int argc, char *argv[])
{
    const char* myArray = "Hello World!";
    QByteArray myByteArray = QByteArray(myArray);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...