Ich stolpere auf ein Problem, und kann keine Lösung finden.Qt qzip-Daten komprimieren
Also was ich tun möchte, ist Daten in Qt dekomprimieren, mit qUncompress (QByteArray), senden von www im Gzip-Format. Ich habe wireshark verwendet, um zu bestimmen, dass dies ein gültiger gzip-Stream ist, der auch mit zip/rar getestet wurde und beide ihn dekomprimieren können.
-Code so weit ist wie folgt aus:
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;
und Dekomprimierung nicht mit: qUncompress: Z_DATA_ERROR: Eingangsdaten beschädigt ist.
AFAIK gzip besteht aus 10 Byte Header, DEFLATE Peyload, 12 Byte Trailer (8 Byte CRC32 + 4 Byte ISIZE - nicht komprimierte Datengröße). Striping Header und Trailer sollte mich mit DEFLATE Datenstrom verlassen, qUncompress liefert den gleichen Fehler.
I mit Datenfolge überprüft in PHP komprimiert, wie folgt aus:.
$stringData = gzcompress("{status:false}", 1);
und qUncompress dekomprimieren, dass Daten (I nicht und gzip-Header nicht sehen, obwohl dh ID1 = 0x1f, ID2 = 0x8B) I geprüft obigen Code mit debuggen und Fehler tritt auf:
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;
}
inflate.c Linie 610.
ich weiß, dass qUncompress einfach ein Wrapper zlib, so dass ich Angenommen, es sollte mit gzip ohne Probleme umgehen. Alle Kommentare sind mehr als willkommen.
Mit freundlichen Grüßen
Welche Ausgabe gibt 'qCompress (" {status: false} ")' und gibt diese Daten dann mit qUncompress? Kann einige zusätzliche Hinweise geben, was vor sich geht. –
QByteArray uncomp = qUncompress (qCompress ("{status: false}")); funktioniert gut, PHP gzcompress (...) funktioniert gut, gzip aus dem WWW funktioniert nicht. Dieser {status: false} wird von WWW geziped, ich habe ihn von wireshark nach array geworfen, daher bin ich sicher, dass es ein gültiger gzip-Stream ist. Einziger Fehler ist, dass qUncomress sagt, dass dies ungültig ist. Traced debug und error tritt bei ((BITS (8) << 8) + (hold >> 8))% 31) = true auf und sollte nicht für einen gültigen Stream verwendet werden. – Talei
Ich ging und schrieb meine eigenen gzip-Funktionen, um auf QByteArrays zu arbeiten (mit zlib und GZipHelper.h) – CiscoIPPhone