iOS(objective-c)compression_decode_buffer()返回零 [英] iOS (objective-c) compression_decode_buffer() returns zero

查看:39
本文介绍了iOS(objective-c)compression_decode_buffer()返回零的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将服务器上的一个非常大的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆