Me tropiezo con un problema y no puedo encontrar una solución.Qt quncompress gzip data
Lo que quiero hacer es descomprimir datos en qt, usando qUncompress (QByteArray), enviar desde www en formato gzip. Utilicé wireshark para determinar que esta es una corriente válida de gzip, también probada con zip/rar y que ambos pueden descomprimirla.
Código hasta el momento, es la siguiente:
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;
Y descompresión falla con: qUncompress: Z_DATA_ERROR: Datos de entrada está dañado.
AFAIK gzip consta de encabezado de 10 bytes, peyload DEFLATE, acoplado de 12 bytes (8 bytes CRC32 + 4 bytes ISIZE - tamaño de datos sin comprimir). El encabezado y el avance del trazado me deberían dejar con la secuencia de datos DEFLATE, qUncompress produce el mismo error.
he comprobado con cadena de datos comprimido en PHP, como este:.
$stringData = gzcompress("{status:false}", 1);
y qUncompress descomprimir que los datos (no vi y la cabecera gzip aunque es decir, ID1 = 0x1f, ID2 = 0x8B) I verificado por encima de código con depuración, y el error se produce en:
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;
}
línea inflate.c 610.
sé que qUncompress es simplemente un envoltorio de zlib, por lo que supongamos que debería manejar gzip sin ningún problema. Cualquier comentario es más que bienvenido.
Saludos
¿Qué salida 'qCompress (" {status: false} ")' da y hace que los datos funcionen con qUncompress? Puede dar algunos consejos adicionales sobre lo que está sucediendo. –
QByteArray uncomp = qUncompress (qCompress ("{status: false}")); funciona bien, PHP gzcompress (...) funciona bien, gzip de WWW no funciona. Este {estado: falso} está escrito por WWW, lo descargué en array de wireshark, por lo que estoy seguro de que es una transmisión gzip válida. El único error es que qUncomress dice que esto no es válido. La depuración y el error se producen en ((BITS (8) << 8) + (mantener >> 8))% 31) = verdadero y no deberían ser válidos. – Talei
Fui y escribí mis propias funciones de gzip para trabajar en QByteArrays (usando zlib y GZipHelper.h) – CiscoIPPhone