данные zlib не распаковываются

Я делаю запрос на свой сервер, который возвращает кучу данных, содержащих несжатую информацию заголовка, а затем запрошенные данные, которые должны быть сжаты с использованием zlib.

поэтому вся загрузка данных выглядит примерно так

(заголовок (несжатый)/данные (сжатый)/конец)

До этого данные никогда не сжимались, поэтому я получаю доступ к информации там

cstring = (char *) malloc(sizeWithLocalOrdering + 1);
            strncpy(cstring, bytes, sizeWithLocalOrdering);
            cstring[sizeWithLocalOrdering] = '\0';
            NSString *resultString = [NSString stringWithCString:cstring encoding:NSUTF8StringEncoding];
            methodResponseData =[resultString dataUsingEncoding:NSUTF8StringEncoding];

sizeWithLocalOrdering определяет, насколько велика часть данных, чтобы я мог правильно прочитать ее из всех данных, которые я получаю с сервера.

Но теперь, когда я получаю данные Zlib. Я хотел бы знать, как мне получить часть данных из материала, который я отправляю, не нарушая сжатия zlib... потому что в настоящее время, когда я передаю MethodResponseData в мой метод декомпрессии, показанный ниже

- (NSData*) dataByDecompressingData:(NSData*)data{
    NSLog(@"%@", data);
    Byte* bytes = (Byte*)[data bytes];
    NSInteger len = [data length];
    NSMutableData *decompressedData = [[NSMutableData alloc] initWithCapacity:COMPRESSION_BLOCK];
    Byte* decompressedBytes = (Byte*) malloc(COMPRESSION_BLOCK);

    z_stream stream;
    int err;
    stream.zalloc = (alloc_func)0;
    stream.zfree = (free_func)0;
    stream.opaque = (voidpf)0;

    stream.next_in = bytes;
//  err = inflateInit(&stream);
    err = inflateInit2(&stream, -MAX_WBITS);
    CHECK_ERR(err, @"inflateInit");

    while (true) {
        stream.avail_in = len - stream.total_in;
        stream.next_out = decompressedBytes;
        stream.avail_out = COMPRESSION_BLOCK;
        err = inflate(&stream, Z_NO_FLUSH);
        [decompressedData appendBytes:decompressedBytes length:(stream.total_out-[decompressedData length])];
        if(err == Z_STREAM_END)
            break;
        CHECK_ERR(err, @"inflate");
    }

    err = inflateEnd(&stream);
    CHECK_ERR(err, @"inflateEnd");

    free(decompressedBytes);
    return decompressedData;
}

он говорит, что Data is .. и я демонстративно отправляю methodReasponse через это демонстративно NSData ... поэтому единственная причина, по которой я могу свести это к этому, заключается в том, что мой метод получателя извлекает данные из ответа, как и я.

Итак, две вещи. Как вы думаете, это причина для ? и, во-вторых, как, по-вашему, я могу исправить данные, чтобы на самом деле это были NSData, и сжатие все еще было, поэтому я могу распаковать с помощью моего метода.


person HurkNburkS    schedule 16.12.2012    source источник


Ответы (1)


Итак, мне удалось изменить способ получения байтов из данных, которые я получаю, на этот

myCompressedData = [NSData dataWithBytes:bytes length:sizeWithLocalOrdering];

это означает, что с форматированием сжатия нет никакой начинки, в отличие от того, что было раньше, тогда я обнаружил еще одну проблему с этой строкой кода.

err = inflateInit2(&stream, -MAX_WBITS);

так что я изменил его обратно на оригинал

err = inflateInit(&stream);

и все получилось правильно.

person HurkNburkS    schedule 17.12.2012