QT quncompress gzip данные

Я натыкаюсь на проблему и не могу найти решение.

Таким образом, то, что я хочу сделать, распаковывают данные в QT, с помощью qUncompress (QByteArray), отправляют от www в gzip формате. Я использовал wireshark, чтобы решить, что это - допустимый gzip поток, также протестированный с zip/rar, и оба могут распаковать его.

Кодируйте до сих пор, похож на это:

    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;

И несжатие перестало работать с: qUncompress: Z_DATA_ERROR: Входные данные повреждаются.

AFAIK gzip состоят из 10-байтового заголовка, ВЫКАЧИВАЮТ peyload, 12-байтовый трейлер (8-байтовый CRC32 + 4-байтовый ISIZE - несжатый размер данных). Чередование заголовка и трейлера должно оставить меня с, ВЫКАЧИВАЮТ поток данных, qUncompress приводит к той же ошибке.

Я сверился со строкой данных, сжатой в PHP, как это:

$stringData = gzcompress( "{status:false}", 1);

и qUncompress распаковывают те данные. (Я не видел и gzip заголовок, хотя т.е. ID1 = 0x1f, ID2 = 0x8b) я проверил выше кода с отладкой, и ошибка происходит в:

        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 610.

Я знаю, что qUncompress является просто оберткой к zlib, таким образом, я предполагаю, что это должно обработать gzip без любой проблемы. Любые комментарии больше затем приветствуются.

С уважением

11
задан ndim 22 April 2010 в 11:37
поделиться

1 ответ

Вы также забыли dataPlusSize.append (data); . Однако это не решит вашу проблему. Проблема в том, что, хотя у gzip и zlib один и тот же формат сжатых данных, их заголовки и трейлеры различны. См .: http://www.zlib.net/zlib_faq.html#faq18

qUncompress использует zlib uncompress , поэтому он может обрабатывать только формат zlib, а не gzip формат. Для обработки формата gzip потребуется вызвать функции gzXXXX .

Причина, по которой qUncompress может обрабатывать вывод PHP gzcompress , заключается в том, что gzcompress сжимает данную строку, используя формат данных ZLIB. См .: http://php.net/manual/en/function.gzcompress.php

Как упоминалось в CiscoIPPhone, вам нужно будет написать свои собственные функции для обработки данных gzip.

5
ответ дан 3 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: