菜鸟教程小白 发表于 2022-12-13 16:37:58

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


                                            <p><p>我正在将我服务器上的一个非常大的 json 结果转换为压缩格式,我可以在我的 objective-c应用程序上解压缩。我更喜欢使用 <a href="https://developer.apple.com/documentation/compression/1481000-compression_decode_buffer?language=objc" rel="noreferrer noopener nofollow">iOS 9 compression lib</a>如果可能的话(libcompression.tbd),在 <a href="https://developer.apple.com/library/archive/samplecode/CompressionSample/Listings/CompressionSample_BlockCompression_c.html" rel="noreferrer noopener nofollow">Apple&#39;s CompressionSample/BlockCompression.c sample code</a> 中描述. </p>

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

<pre><code>#include &#34;compression.h&#34;
</code></pre>

<p>...</p>

<pre><code>    - (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);
      ;

      size_t decompressedSize = compression_decode_buffer(dst_buffer, dst_buffer_size, src_buffer, compressed.length, nil, COMPRESSION_ZLIB);
      NSData *decompressed = [ initWithBytes:dst_buffer length:decompressedSize];
      return decompressed;
    }
</code></pre>

<p><code>compressed</code> 参数的长度与我的服务器日志匹配,但 <code>compression_decode_buffer</code> 的结果始终为零,并且 <code>dst_buffer</code> 未修改。我没有收到任何错误,日志也没有相关信息。</p>

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

<p>我在这里做错了什么?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>经过大量测试和研究,我发现我在服务器上使用的压缩库添加了一个压缩头(第一个两个字节),根据 <a href="https://www.ietf.org/rfc/rfc1950.txt" rel="noreferrer noopener nofollow">RFC1950</a> .我跳过了这两个字节, <code>compression_decode_buffer</code> 就像一个冠军!</p>

<pre><code>- (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);
    ;

    size_t decompressedSize = compression_decode_buffer(dst_buffer, dst_buffer_size, src_buffer, compressed.length - 2, nil, COMPRESSION_ZLIB);
    NSData *decompressed = [ initWithBytes:dst_buffer length:decompressedSize];
    return decompressed;
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于iOS(objective-c)compression_decode_buffer() 返回零,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37367884/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37367884/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iOS(objective-c)compression_decode_buffer() 返回零