2017-01-12 8 views
2

Я использую некоторые функции для преобразования QVector's в QByteArray's, например:Как преобразовать QByteArray в строку в Qt 5.3?

QByteArray Serialize::serialize(QVector<double> data) 
{ 
    QByteArray byteArray; 
    QDataStream out(&byteArray, QIODevice::WriteOnly); 
    out << data; 
    return byteArray; 
} 

void Serialize::deserialize(QByteArray byteArray, QVector<double> *data) 
{ 
    QDataStream in(&byteArray, QIODevice::ReadOnly); 
    in >> *data; 
} 

Теперь, что у меня есть QByteArray мне нужно поместить его в текстовый файл, как я могу преобразовать его в QString?

Я уже попробовал самый простой способ:

QString myString(data); // data - QByteArray 

Но myString всегда пусто.

Я также нашел функцию toStdString() в документации, но был введен только в Qt 5.4.

Я использую Qt 5.3.

Следит полный пример:

#include <QCoreApplication> 

#include <QDebug> 
#include <QVector> 
#include <QByteArray> 
#include <QDataStream> 

QByteArray serialize(QVector<double> data) 
{ 
    QByteArray byteArray; 
    QDataStream out(&byteArray, QIODevice::WriteOnly); 
    out << data; 
    return byteArray; 
} 

void deserialize(QByteArray byteArray, QVector<double> *data) 
{ 
    QDataStream in(&byteArray, QIODevice::ReadOnly); 
    in >> *data; 
} 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    QVector<double> data; 
    data << 1.1 << 2.2 << 3.3 << 4.4 << 5.5 << 6.6 << 7.7 << 8.8 << 9.9; 

    QByteArray byteArray = serialize(data); 
    QVector<double> dataConverted; 
    deserialize(byteArray, &dataConverted); 

    qDebug() << "Data:"; 
    qDebug() << data; 
    qDebug() << "ByteArray:"; 
    QString test(byteArray); 
    qDebug() << test; 
    qDebug() << "Data Converted:"; 
    qDebug() << dataConverted; 

    return a.exec(); 
} 

Примечание: Общая цель этого заключается в создании SQL файл со всем содержимым из базы данных SQLite. Мой двойной вектор преобразуется в QByteArray и сохраняется как BLOB в базе данных (с использованием функции сериализации). Когда мне нужно загрузить его из базы данных, я использую функцию десериализации для преобразования в двойной вектор снова. Теперь мне нужно сгенерировать файл SQL с данными в формате BLOB, после чего я могу напрямую импортировать его в другую базу данных.

ответ

2

Проблема заключается в том, что массив байтов является типом типа агностик, он просто представляет собой набор отдельных байтов в памяти. В вашем примере кода вы создаете массив байтов из вектора удвоений, а затем преобразуете обратно в другой вектор двойников. Нет проблем.

Однако, когда вы передаете массив байтов в конструктор QString, QString пытается интерпретировать байтовый массив как данные, представляющие строку, например массив символов ASCII.

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

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

+0

Большое спасибо за полное объяснение. Теперь я понял проблему, но я все еще не знаю, как ее напечатать. Вы знаете, как я могу напечатать массив байтов? Мне нужно сгенерировать ** SQL ** -файл с ** содержимым BLOB ** (сгенерированным 'QByteArray') из базы данных. – KelvinS

+0

Возможно, я ошибаюсь, но не могли ли вы просто перевернуть вектор, распечатывая каждый элемент в строке? Очень простой пример: 'QString printVector (QVector * vector) { QString output; for (int index = 0; index < vector-> length(); index ++) { output + = QString :: number (vector-> at (index)) + ","; } return output; } ' – Benp44

+0

На самом деле, я не могу, потому что он просто вернет двойной вектор как ** QString ** (например,« 1.2.123.2.42.1 »). Мне нужно напечатать его в виде байтового массива в ** SQL **, потому что мне нужно будет импортировать его в другую базу данных. Например: «INSERT INTO myTable VALUES (14,« name », here_is_my_blob_type_saved_as_qbytearray);'. ** Примечание **: Я использую ** SQLite **. – KelvinS

2

Использование QTextCodec для преобразования из QByteArray в QString, вот пример из official docs:

QByteArray encodedString = "..."; 
QTextCodec *codec = QTextCodec::codecForName("KOI8-R"); 
QString string = codec->toUnicode(encodedString); 

И сделать пример работы, вам необходимо преобразовать двойников в QString с во время сериализации:

QByteArray serialize(QVector<double> data) 
{ 
    QByteArray byteArray; 
    QDataStream out(&byteArray, QIODevice::WriteOnly); 
    for (double d : data) { 
     out << QString::number(d); 
    } 
    return byteArray; 
} 

Если вы не хотите конвертировать индивидуальные номера в строку, вы также можете «укрепить» QByteArray с помощью byteArray.toHex():

qDebug() << "ByteArray:"; 
QString test(byteArray.toHex()); 
+0

Я пробовал, но я все равно получаю пустую строку. 'qDebug() << QTextCodec :: codecForName (« KOI8-R ») -> toUnicode (byteArray); ** Примечание **: мой QByteArray« закодирован »из« QVector ». Я думаю, что из-за этого ваш пример не работает. – KelvinS

+0

Проблема заключается в вашем методе 'serialize()', вам нужно использовать 'QString :: number()'. Я изменю свой ответ, чтобы объяснить. –

+0

Возможно, это может сработать, но мне нужно использовать данные как двойные, тогда мне нужно будет преобразовывать их каждый раз, когда я сериализую или десериализую данные (** QString ** -> ** double ** или ** double * * -> ** QString **). Мои данные очень большие, и это может быть проблемой. – KelvinS