OGeek|极客世界-中国程序员成长平台

标题: iOS(objective-c)compression_decode_buffer() 返回零 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 16:37
标题: iOS(objective-c)compression_decode_buffer() 返回零

我正在将我服务器上的一个非常大的 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-推荐答案


经过大量测试和研究,我发现我在服务器上使用的压缩库添加了一个压缩头(第一个两个字节),根据 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/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) Powered by Discuz! X3.4