ho inciampare su un problema, e non riescono a trovare una soluzione.Qt quncompress dati gzip
Quindi quello che voglio fare è decomprimere i dati in qt, usando qUncompress (QByteArray), inviare da www in formato gzip. Ho usato wireshark per determinare che questo è valido per gzip stream, anche testato con zip/rar ed entrambi possono decomprimerlo.
codice finora, è come questo:
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;
E decompressione fallisce con: qUncompress: Z_DATA_ERROR: Dati di ingresso è danneggiato.
AFAIK gzip consiste di 10 byte header, DEFLATE peyload, 12 byte trailer (8 byte CRC32 + 4 byte ISIZE - dimensione dati non rappresentati). L'intestazione e il trailer di striping dovrebbero lasciarmi con il flusso di dati DEFLATE, qUncompress restituisce lo stesso errore.
Ho controllato con stringa di dati compressi in PHP, in questo modo:.
$stringData = gzcompress("{status:false}", 1);
e qUncompress decomprimere i dati (non ho visto e intestazione gzip se cioè ID1 = 0x1F, ID2 = 0x8b) I verificata sopra il codice con il debug, e l'errore si verifica in:
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;
}
linea inflate.c 610.
so che qUncompress è semplicemente un wrapper per zlib, così ho supponiamo che dovrebbe gestire gzip senza alcun problema. Qualsiasi commento è più che benvenuto.
migliori saluti
Quale output fa 'qCompress (" {status: falso} ")' fornisce e fa quei dati quindi funziona con qUncompress? Può dare qualche suggerimento in più su cosa sta succedendo. –
QByteArray uncomp = qUncompress (qCompress ("{stato: falso}")); funziona bene, PHP gzcompress (...) funziona bene, gzip di WWW non funziona. Questo {status: falso} è gzipato da WWW, l'ho scaricato su array da wireshark, quindi sono positivo che sia valido per gzip stream. L'unico errore è che qUncomress dice che questo non è valido. Il debug e l'errore di tracciamento si verificano in ((BITS (8) << 8) + (premuto >> 8))% 31) = true e non dovrebbero per flusso valido. – Talei
Sono andato e ho scritto le mie funzioni gzip per lavorare su QByteArrays (usando zlib e GZipHelper.h) – CiscoIPPhone