Je tombe sur un problème et ne trouve pas de solution.Qt quncompress données gzip
Donc, ce que je veux faire est de décompresser les données en qt, en utilisant qUncompress (QByteArray), envoyer à partir de www en format gzip. J'ai utilisé wireshark pour déterminer que c'est un flux gzip valide, également testé avec zip/rar et les deux peuvent le décompresser.
jusqu'à présent code, 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 échoue avec uncompression: qUncompress: Z_DATA_ERROR: les données d'entrée est corrompu. AFAIK gzip se compose d'un en-tête de 10 octets, d'un peyload DEFLATE, d'une bande-annonce de 12 octets (CRC32 de 8 octets + ISIZE de 4 octets - taille de données non comprimée). L'en-tête de bande et la bande-annonce doivent me laisser avec le flux de données DEFLATE, qUncompress génère la même erreur.
J'ai vérifié avec chaîne de données compressées en PHP, comme ceci:.
$stringData = gzcompress("{status:false}", 1);
et qUncompress Décompressez que les données (je ne voyais pas et tête gzip bien-à-dire ID1 = 0x1f, ID2 = 0x8b) I vérifié code ci-dessus avec le 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;
}
ligne inflate.c 610.
Je sais que qUncompress est tout simplement un emballage à zlib, donc je supposons qu'il devrait gérer gzip sans aucun problème. Tous les commentaires sont plus que bienvenus.
Meilleures salutations
Quelle est la sortie de 'qCompress (" {status: false} ")' donne et fait fonctionner ces données avec qUncompress? Peut donner quelques indications supplémentaires sur ce qui se passe. –
QByteArray uncomp = qUncompress (qCompress ("{status: false}")); fonctionne bien, PHP gzcompress (...) fonctionne bien, gzip de WWW ne fonctionne pas. Ce {status: false} est gzipé par WWW, je l'ai jeté à array de wireshark, donc je suis positif que c'est un flux gzip valide. Seule l'erreur est que qUncomress indique que ceci est invalide. Le débogage et l'erreur tracés se produisent à ((BITS (8) << 8) + (maintenez >> 8))% 31) = true et ne devraient pas pour le flux valide. – Talei
Je suis allé et a écrit mes propres fonctions gzip pour travailler sur QByteArrays (en utilisant zlib et GZipHelper.h) – CiscoIPPhone