12
votes

Qt QunCompress Gzip Data

Je trébuche sur un problème et je ne trouve pas de solution.

Alors, ce que je veux faire, c'est de décompresser des données dans qt, en utilisant Quncompress (QbyTeArray), envoyer de www in gzip format. J'ai utilisé WireShark pour déterminer qu'il s'agit d'un flux GZIP valide, également testé avec Zip / Rar et les deux peuvent décompresser. P>

Code jusqu'à présent, est comme ceci: P>

        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;
        } 


3 commentaires

Quelle sortie qcompresser ("{statut: false}") donne et ces données fonctionnent alors avec quncompress? Peut donner quelques astuces supplémentaires quant à ce qui se passe.


Qbyearrararagneg = Quncompress (qcompress ("{statut: faux}")); Fonctionne bien, php gzcompress (...) fonctionne bien, gzip de www ne fonctionne pas. Ceci {Statut: False} est gzipède par www, je l'ai largué à la matrice de Wireshark, donc je suis positif qui est un flux GZIP valide. Seule une erreur est que QUNComress dit que cela n'est pas valide. Le débogage tracé et l'erreur se produisent à ((bits (8) << 8) + (Hold >> 8))% 31) = True et ne devrait pas pour le flux valide.


Je suis allé et j'ai écrit mes propres fonctions GZIP pour travailler sur qbyeArrays (en utilisant zlib et gziphelper.h)


3 Réponses :


6
votes

Vous avez également oublié dataplussize.append (données); . Cependant, cela ne résoudra pas votre problème. Le problème est que, tandis que GZIP et ZLIB ont le même format de données comprimé, leurs en-têtes et les remorques sont différents. Voir: http://www.zlib.net/zlib_faq.html#faq18

Quncompress Utilise le zlib décompressez , il ne peut donc que gérer le format ZLIB, pas le format GZIP. Il faudrait appeler les fonctions gzxxxx pour gérer le format GZIP.

La raison pour laquelle Quncompresser peut gérer la sortie de PHP 'CODE> GZCompress est que gzcompress compresse la chaîne donnée à l'aide du format de données ZLIB. Voir: http://php.net/manual/fr/function.gzcompresser.php

En tant que ciscoIPPhone mentionné, vous devrez écrire la vôtre pour fonctionner pour traiter les données GZIP.


3 commentaires

Je n'ai pas oublié, c'est seulement une faute de frappe ici sur le forum et je l'ai appelle après un calcul de la taille de la taille. Cela ne signifie-t-il pas que lorsque j'entraînerais l'en-tête / la remorque ZLIB doit décompresser le flux de dégonfler? Parce que même lorsque vous me dirigez d'écrire ma propre chose, je devrai décompresser correctement les données de flux dégonfler avec zlib ou quncompress. D'AILLEURS. J'ai essayé de dépouiller des données et d'envoyer uniquement des flux de déflate, aussi une erreur. J'ai forcé Web à m'a donné une réponse avec une erreur de flux de déflèvement.


Également dans Inflated.c Il y a: Si ((((((((((((État-> wrap & 2) && Hold == 0x8b1f) {...} / * gzip en-tête * / pour mon dat [] C'est faux. Pourquoi est-ce que ça, j'ai eu ID1 & ID2 à 1,2?


J'ai fait ce que vous avez suggéré et il était plus facile que je pensais que ce serait. Merci.




13
votes

Voici ma contribution ... J'ai développé une classe ( qCompressor code>), basé sur zlib code> pour compresser facilement / décompresser qbytearray code> Utilisation de gzip.

qcompressor.h code>: p> xxx pré>

qcompressor.cpp code>: p>

#include <QDebug>
#include "qcompressor.h"

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

    QString initialPlainText = "This is a test program for verifying that the QCompressor class works fine!";

    qDebug() << "Initial plain text is: " << initialPlainText;

    QByteArray compressed;

    if(QCompressor::gzipCompress(initialPlainText.toLatin1(), compressed))
    {
        qDebug() << "Compressed text length is:" << compressed.length();

        QByteArray decompressed;

        if(QCompressor::gzipDecompress(compressed, decompressed))
        {
            qDebug() << "Decompressed text is: " << QString::fromLatin1(decompressed);
        }
        else
            qDebug() << "Can't decompress";
    }
    else
        qDebug() << "Can't compress";
}


0 commentaires