iOS (objective-c) compression_decode_buffer() 返回零

标签 ios objective-c compression

我正在将我服务器上的一个非常大的 json 结果转换为我可以在我的 objective c 应用程序上解压缩的压缩格式。我更愿意使用 iOS 9 compression lib如果可能 (libcompression.tbd),在 Apple's CompressionSample/BlockCompression.c sample code 中描述.

我将压缩的 NSData 结果传递给以下方法:

#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 未被修改。我没有收到任何错误,并且日志中没有相关信息。

我在服务器端尝试了 ZLIB 和 LZ4 压缩/解压方法和几个库,结果都是一样的。

我在这里做错了什么?

最佳答案

经过大量测试和研究,我发现我在我的服务器上使用的压缩库添加了一个压缩 header (第一个两个字节),每 RFC1950 .我跳过了这两个字节,compression_decode_buffer 工作得很好!

- (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() 返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37367884/

相关文章:

php - 如何用php压缩站点地图

android-将视频压缩到 firebase 存储

c# - 如何在多个数据 block 上使用 DeflateStream?

ios - EXC_BAD_ACCESS 在 enumerateObjectsUsingBlock 中设置传递回写错误

ios - AVFoundation 将第一帧添加到视频

c++ - 单词的 SQL 哈希表

ios - 为 objective-c 中的方法传递未知类型的参数,可能吗?

ios - 获取 UIWebView 响应头

ios - 无法为 ios 构建和安装 openH264 视频编解码器

iphone - UITableViewCell 自定义图片大小、阴影和边框