0

圧縮されていないヘッダー情報を含む一連のデータを返しているサーバーに要求を行っています。次に、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;
}

そのことわざデータは..そして私は反抗的にメソッドReasponseを送信していますそれは反抗的にNSDataです...したがって、私がこのようにそれを置くことができる唯一の理由は、私のように応答からデータをプルする受信機メソッドのためです。

それで2つのこと、これが理由だと思いますか?次に、データを修正して実際にNSDataにし、圧縮がまだ残っているので、自分のメソッドで解凍できるようにするにはどうすればよいと思いますか。

4

1 に答える 1

0

だから私は受信したデータからバイトを取得する方法をこれに変更することができました

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

これは、以前とは異なり、圧縮フォーマットに詰め込みがないことを意味します。その後、このコード行で別の問題を発見しました

err = inflateInit2(&stream, -MAX_WBITS);

なので元に戻しました

err = inflateInit(&stream);

そしてそれはすべて正しく機能しました。

于 2012-12-17T03:31:06.807 に答える