Ios zlib数据未解压缩
我向我的服务器发出一个请求,该请求传递回一组数据,其中包含未压缩的头信息,然后是已请求的数据,该数据应使用zlib进行压缩 因此,整个数据负载看起来像 (标题(未压缩)/数据(压缩)/结束) 在此之前,数据从未被压缩过,因此这就是我访问其中信息的方式Ios zlib数据未解压缩,ios,nsdata,zlib,Ios,Nsdata,Zlib,我向我的服务器发出一个请求,该请求传递回一组数据,其中包含未压缩的头信息,然后是已请求的数据,该数据应使用zlib进行压缩 因此,整个数据负载看起来像 (标题(未压缩)/数据(压缩)/结束) 在此之前,数据从未被压缩过,因此这就是我访问其中信息的方式 cstring = (char *) malloc(sizeWithLocalOrdering + 1); strncpy(cstring, bytes, sizeWithLocalOrdering);
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;
}
据说数据是。。而我正在挑战性地发送MethodResponse,这是挑战性的NSData。。。所以我能把它说成是这样的唯一原因是因为我的接收器方法像我一样从响应中提取数据
所以有两件事,你认为这就是为什么会这样吗?第二,你认为我如何修复数据,使它实际上是NSData,压缩仍然存在,这样我就可以用我的方法解压。所以我设法改变了从接收到的数据中获取字节的方式
myCompressedData = [NSData dataWithBytes:bytes length:sizeWithLocalOrdering];
这意味着不像以前那样,压缩格式没有填充,然后我发现了这行代码的另一个问题
err = inflateInit2(&stream, -MAX_WBITS);
所以我把它改回原来的
err = inflateInit(&stream);
这一切都是正确的