iOS(objective-c)compression_decode_buffer()返回零 [英] iOS (objective-c) compression_decode_buffer() returns zero
问题描述
我正在将服务器上的一个非常大的json结果转换为可以在目标c应用程序上解压缩的压缩格式.我希望尽可能使用 iOS 9压缩库(libcompression.tbd),在 Apple的CompressionSample/BlockCompression.c中进行了描述示例代码.
I'm converting a very large json result on my server to a compressed format that I can decompress on my objective c app. I would prefer to use the iOS 9 compression lib if possible (libcompression.tbd), described in Apple's CompressionSample/BlockCompression.c sample code.
我将压缩的NSData结果传递给以下方法:
I'm passing the compressed NSData result to the following method:
#include "compression.h"
...
- (NSData *) getDecompressedData:(NSData *) 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
未被修改.我没有收到任何错误,并且日志中没有相关信息.
The compressed
parameter has a length that matches my server logs, but the result from compression_decode_buffer
is always zero and dst_buffer
is not modified. I'm not receiving any errors, and the log has no relevant info.
我已经尝试了ZLIB和LZ4压缩/解压缩方法以及服务器端的几个库,所有这些都具有相同的结果.
I've tried ZLIB and LZ4 compression / decompression methods and several libraries on the server side, all with the same result.
我在做什么错了?
推荐答案
经过大量测试和研究,我发现我在服务器上使用的压缩库为每个 RFC1950 .我跳过了这两个字节, compression_decode_buffer
就像冠军!
After much testing and research, I found that the compression library I was using on my server adds a compression header (1st two bytes), per RFC1950. I skipped those two bytes and compression_decode_buffer
works like a champ!
- (NSData *) getDecompressedData:(NSData *) 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()返回零的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!