swift-gzip解压缩(二)-NSData

工程目前以objective-c为主,采用的是swift与objective-c混编方式,因此对NSData作了扩展。

gzip压缩

 /// gzip数据压缩
    ///
    /// - Returns: Data
    public func gzipCompress() -> NSData? {
        
        guard self.length > 0 else {
            return self
        }
        
        var stream = z_stream()
        stream.avail_in = uInt(self.length)
        stream.total_out = 0
        
        (self as Data).withUnsafeBytes { (bytes:UnsafePointer<Bytef>) in
            stream.next_in = UnsafeMutablePointer<Bytef>(mutating:bytes)
        }

        var status = deflateInit2_(&stream,Z_DEFAULT_COMPRESSION, Z_DEFLATED, MAX_WBITS + 16, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY, ZLIB_VERSION, GZIP_STREAM_SIZE)
        
        if  status != Z_OK {
            return  nil
        }

        let compressedData = NSMutableData()
        
        while stream.avail_out == 0 {
            
            stream.avail_out = uInt(GZIP_BUF_LENGTH)
            stream.next_out = GZipBuf
            
            status = deflate(&stream, Z_FINISH)
            
            if status != Z_OK && status != Z_STREAM_END {
                return nil
            }else {
                let dataLength = GZIP_BUF_LENGTH - Int(stream.avail_out)
                
                if dataLength > 0 {
                    compressedData.append(GZipBuf, length: dataLength)
                }
                
            }
        }
        
        guard deflateEnd(&stream) == Z_OK else {
            return nil
        }
    
        return compressedData
    }

gzip压缩


    /// gzip数据解压
    ///
    /// - Returns: NSData
    public func gzipUncompress() -> NSData? {
        guard self.length > 0 else {
            return nil
        }
        
        guard self.isGZipCompressed else {
            return self
        }
        
        var  stream = z_stream()
        
        (self as Data).withUnsafeBytes { (bytes:UnsafePointer<Bytef>) in
            stream.next_in = UnsafeMutablePointer<Bytef>(mutating:bytes)
        }

        stream.avail_in = uInt(self.length)
        stream.total_out = 0
      

        var status: Int32 = inflateInit2_(&stream, MAX_WBITS + 16, ZLIB_VERSION,GZIP_STREAM_SIZE)
        
        guard status == Z_OK else {
            return nil
        }

        let decompressed = NSMutableData(capacity: self.length * 2)
     
        while stream.avail_out == 0 {

            stream.avail_out = uInt(GZIP_BUF_LENGTH)
            stream.next_out = GZipBuf
            status = inflate(&stream, Z_SYNC_FLUSH)

            if status != Z_OK && status != Z_STREAM_END {
                break
            }else {
                
                let dataLen :Int = GZIP_BUF_LENGTH - Int(stream.avail_out);
                
                if dataLen > 0 {
                    decompressed?.append(GZipBuf, length: dataLen)
                }
            }
        }
        
        if inflateEnd(&stream) != Z_OK {
            return nil
        }
        
        return decompressed!
    }
  
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,870评论 1赞 32
  • 既然很在乎,何必太清楚。 谁又曾知:相逢便是无可替代,相爱不必追根究底。 在时间的洪流中,我就像一朵浮萍,循着生命...
    路儿阅读 551评论 0赞 2
  • 最近的天空总是冰冷的神色,却又不像冬天里的灰白。 这时候的天已经黑严,我还没有回家。一个人呆呆地走在稻田间的小路上...
    麦特先生阅读 2,430评论 0赞 2
  • 早霞映水浪轻扬, 回落江堤坝渐长。 再胜洪魔新业立, 凯旋将士系行囊。 驱车蹑入临朝幕, 岂料人民已两行。 鱼水军...
    神雕大侠o阅读 158评论 0赞 0

友情链接更多精彩内容