Qt quncompress de données gzip
Je tombe sur un problème, et ne pouvez pas trouver une solution.
Donc ce que je veux faire est de décompresser des données dans qt, à l'aide de qUncompress(QByteArray), envoyer www gzip format. J'ai utilisé wireshark afin de déterminer ce que cela est valable gzip flux, également testé avec zip/rar et les deux peuvent décompresser.
Code jusqu'à présent, c'est comme ceci:
static const char dat[40] = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xaa, 0x2e, 0x2e, 0x49, 0x2c, 0x29,
0x2d, 0xb6, 0x4a, 0x4b, 0xcc, 0x29, 0x4e, 0xad, 0x05, 0x00, 0x00, 0x00, 0xff, 0xff, 0x03, 0x00,
0x2a, 0x63, 0x18, 0xc5, 0x0e, 0x00, 0x00, 0x00
};
//this data contains string: {status:false}, in gzip format
QByteArray data;
data.append( dat, sizeof(dat) );
unsigned int size = 14; //expected uncompresed size, reconstruct it BigEndianes
//prepand expected uncompressed size, last 4 byte in dat 0x0e = 14
QByteArray dataPlusSize;
dataPlusSize.append( (unsigned int)((size >> 24) & 0xFF));
dataPlusSize.append( (unsigned int)((size >> 16) & 0xFF));
dataPlusSize.append( (unsigned int)((size >> 8) & 0xFF));
dataPlusSize.append( (unsigned int)((size >> 0) & 0xFF));
QByteArray uncomp = qUncompress( dataPlusSize );
qDebug() << uncomp;
Et décompression échoue avec: qUncompress: Z_DATA_ERROR: Entrée de données est endommagé.
Autant que je sache, gzip composé de 10 octets d'en-tête, DÉGONFLER peyload, 12 octets de remorque ( 8 octets CRC32 + 4 octets ISIZE - uncompresed taille des données ).
L'entrelacement de l'en-tête et de la remorque doit me laisser avec DÉGONFLER flux de données, qUncompress rendements de la même erreur.
J'ai vérifié avec la chaîne de données compressées en PHP, comme ceci:
$stringData = gzcompress( "{status:false}", 1);
et qUncompress décompresser des données.(Je n'ai pas vu et gzip-tête mais c'est à dire ID1 = 0x1f, ID2 = 0x8b )
J'ai vérifié le code ci-dessus avec de débogage, et l'erreur se produit à:
if (
#endif
((BITS(8) << 8) + (hold >> 8)) % 31) { //here is error, WHY? long unsigned int hold = 35615
strm->msg = (char *)"incorrect header check";
state->mode = BAD;
break;
}
gonfler.c ligne 610.
Je sais que qUncompress est tout simplement un wrapper de zlib, donc je suppose qu'il doit traiter gzip sans aucun problème. Tous les commentaires sont le bienvenue.
En ce qui concerne meilleur
qCompress("{status:false}")
donner et le fait que les données puis de travailler avec qUncompress? Peut donner quelques conseils supplémentaires à ce qui se passe.QByteArray uncomp = qUncompress( qCompress("{statut:false}") ); fonctionne très bien, PHP gzcompress(...) fonctionne très bien, gzip de WWW ne fonctionnent pas. Ce {statut:false} est gziped par WWW, je l'ai jetée à la matrice de wireshark, donc je suis positif, qui est valide gzip flux. Une seule erreur, c'est que qUncomress dit que c'est invalide. Tracé de débogage et d'erreur se produit au ((BITS(8) << 8) + (hold >> 8)) % 31) = vrai et ne devrait pas valides dans le flux.
J'ai écrit mes propres gzip fonctions pour travailler sur QByteArrays (à l'aide de la librairie zlib et GZipHelper.h)
OriginalL'auteur Talei | 2010-04-22
Vous devez vous connecter pour publier un commentaire.
Vous avez aussi oublié
dataPlusSize.append(data);
. Cependant, ce n'est pas de résoudre votre problème. Le problème est que, bien que gzip et zlib ont le même comprimé de format de données, leurs en-têtes et les remorques sont différents. Voir: http://www.zlib.net/zlib_faq.html#faq18qUncompress
utilise la librairie zlibuncompress
, de sorte qu'il ne peut gérer que la zlib format, pas le format gzip. Il aurait besoin d'appeler legzXXXX
des fonctions pour gérer le format gzip.La raison que
qUncompress
peut gérer la sortie de PHPgzcompress
est quegzcompress
comprime la chaîne à l'aide de la librairie ZLIB format de données. Voir: http://php.net/manual/en/function.gzcompress.phpComme CiscoIPPhone mentionné, vous aurez besoin d'écrire vos propres fonctions pour gérer les données gzip.
Aussi à gonfler.c, est la suivante: si ((état->écharpe & 2) && hold == 0x8b1f) { ... } /* l'en-tête gzip */ pour ma dat[] c'est FAUX. Pourquoi est-ce, je me suis ID1&ID2 à 1,2?
J'ai fait ce que Vous avez proposé et Il a été plus facile que je pensais que Ce serait. Merci.
OriginalL'auteur David Walthall
Voici ma contribution... j'ai développé une classe (
QCompressor
), basé surzlib
pour facilement compresser/décompresserQByteArray
à l'aide de GZIP.qcompressor.h
:qcompressor.cpp
:et ici le
main()
de mon programme de test:Pour que cela fonctionne, vous devez ajouter une ligne
LIBS += -lz
à votre.pro
fichier pour relier contrezlib
.OriginalL'auteur Morix Dev
Directement à l'aide de la librairie zlib est pas difficile.
J'ai fait comme ceci:
Le code est monstly copié à partir de la zlib exemple de code de page.
Vous aurez besoin de
include <zlib.h>
OriginalL'auteur Ralf