2017-01-12 4 views
2

J'utilise des fonctions pour convertir QVector's à QByteArray's, par exemple:Comment puis-je convertir QByteArray en chaîne dans 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; 
} 

Maintenant, que j'ai le QByteArray que je dois le mettre dans un fichier texte, comment puis-je convertir en QString?

je l'ai déjà essayé la façon la plus simple:

QString myString(data); // data - QByteArray 

Mais myString est toujours vide.

J'ai également trouvé la fonction toStdString() dans la documentation, mais elle a été introduite seulement dans Qt 5.4. J'utilise Qt 5.3.

Suit un exemple complet:

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

Remarque: L'objectif général de c'est de générer un fichier SQL avec tout le contenu de la base de données SQLite . Mon double vecteur est converti en QByteArray et stocké en tant que BLOB dans la base de données (à l'aide de la fonction sérialiser). Quand j'ai besoin de le charger depuis la base de données, j'utilise la fonction deserialize pour la convertir en un double vecteur. Maintenant, je dois générer le fichier SQL avec les données dans le format BLOB, puis je peux directement l'importer dans une autre base de données.

Répondre

2

Le problème est qu'un tableau d'octets est un type de données agnostique de type, il représente simplement une collection d'octets individuels en mémoire. Dans votre exemple de code, vous créez le tableau d'octets à partir d'un vecteur de doubles, puis vous convertissez de nouveau vers un autre vecteur de doubles. Aucun problème.

Toutefois, lorsque vous passez le tableau d'octets dans le constructeur QString, la chaîne Q essaye d'interpréter le tableau d'octets comme des données qui représentent une chaîne, par exemple un tableau de codes de caractères ASCII. Certaines classes de chaînes peuvent vous laisser faire cela, et créer une instance remplie d'ordures, mais QString semble faire quelques erreurs de base et vous aider en vous donnant une chaîne vide.

Comme pour du code pour imprimer le contenu d'un tableau d'octets de doubles, la méthode de désérialisation que vous avez fournie n'est pas un mauvais exemple.

+0

Merci beaucoup pour l'explication complète. Maintenant, j'ai compris le problème, mais je ne sais toujours pas comment je peux l'imprimer. Savez-vous comment puis-je imprimer le tableau d'octets? J'ai besoin de générer un fichier ** SQL ** avec le contenu ** BLOB ** (généré par un 'QByteArray') de la base de données. – KelvinS

+0

Je suis peut-être malentendu, mais ne pourriez-vous pas simplement faire une boucle sur le vecteur, en imprimant chaque élément à une chaîne? Exemple très basique: 'QString printVector (QVecteur * vectoriel) { QSortie de sortie; pour (int indice = 0; index < vector-> longueur(); index ++) { sortie + = QString :: nombre (vector-> at (index)) + ","; } sortie de retour; } ' – Benp44

+0

En fait, je ne peux pas parce qu'il retournera simplement le double vecteur comme un ** QString ** (par exemple" 1,2,123,2,42.1 "). J'ai besoin de l'imprimer en tant que tableau d'octets dans le fichier ** SQL ** car je devrai l'importer dans une autre base de données. Exemple: "' INSERT INTO myTable VALUES (14, "nom", here_is_my_blob_type_saved_as_qbytearray); '". ** Note **: J'utilise ** SQLite **. – KelvinS

2

Utilisez QTextCodec convertir QByteArray à QString, voici un exemple de official docs:

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

Et pour faire le travail par exemple, vous avez besoin de convertir les doubles à QString s pendant la sérialisation:

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

Si vous ne voulez pas convertir des nombres individuels en chaîne, vous pouvez également "stringifier" le QByteArray avec byteArray.toHex():

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

Je l'ai essayé mais je reçois toujours une chaîne vide. 'qDebug() << QTextCodec :: codecForName (" KOI8-R ") -> àUnicode (byteArray);' ** Note **: mon QByteArray est "encodé" à partir d'un 'QVector '. Je pense que votre exemple ne fonctionne pas à cause de cela. – KelvinS

+0

Le problème est dans votre méthode 'serialize()', vous devez utiliser 'QString :: number()'. Je vais changer ma réponse pour expliquer. –

+0

Peut-être que cela peut fonctionner mais j'ai besoin d'utiliser les données comme type double, puis je devrai le convertir chaque fois que je sérialiser ou désérialiser les données (** QString ** -> ** double ** ou ** double * * -> ** QString **). Mes données sont très volumineuses et cela peut poser un problème. – KelvinS