我正在将我服务器上的一个非常大的 json 结果转换为压缩格式,我可以在我的 objective-c 应用程序上解压缩。我更喜欢使用 iOS 9 compression lib如果可能的话(libcompression.tbd),在 Apple's CompressionSample/BlockCompression.c sample code 中描述.
我将压缩的 NSData 结果传递给以下方法:
#include "compression.h"
...
- (NSData *) getDecompressedDataNSData *) compressed {
size_t dst_buffer_size = 20000000; //20MB
uint8_t *dst_buffer = malloc(dst_buffer_size);
uint8_t *src_buffer = malloc(compressed.length);
[compressed getBytes:src_buffer length:compressed.length];
size_t decompressedSize = compression_decode_buffer(dst_buffer, dst_buffer_size, src_buffer, compressed.length, nil, COMPRESSION_ZLIB);
NSData *decompressed = [[NSData alloc] initWithBytes:dst_buffer length:decompressedSize];
return decompressed;
}
compressed 参数的长度与我的服务器日志匹配,但 compression_decode_buffer 的结果始终为零,并且 dst_buffer 未修改。我没有收到任何错误,日志也没有相关信息。
我在服务器端尝试了 ZLIB 和 LZ4 压缩/解压方法和几个库,结果都一样。
我在这里做错了什么?
Best Answer-推荐答案 strong>
经过大量测试和研究,我发现我在服务器上使用的压缩库添加了一个压缩头(第一个两个字节),根据 RFC1950 .我跳过了这两个字节, compression_decode_buffer 就像一个冠军!
- (NSData *) getDecompressedDataNSData *) compressed {
size_t dst_buffer_size = 20000000; //20MB
uint8_t *dst_buffer = malloc(dst_buffer_size);
uint8_t *src_buffer = malloc(compressed.length);
[compressed getBytes:src_buffer range:NSMakeRange(2, compressed.length - 2)];
size_t decompressedSize = compression_decode_buffer(dst_buffer, dst_buffer_size, src_buffer, compressed.length - 2, nil, COMPRESSION_ZLIB);
NSData *decompressed = [[NSData alloc] initWithBytes:dst_buffer length:decompressedSize];
return decompressed;
}
关于iOS(objective-c)compression_decode_buffer() 返回零,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/37367884/
|