swift-gzip解壓縮(二)-NSData

工程目前以objective-c為主陈醒,采用的是swift與objective-c混編方式讳苦,因此對(duì)NSData作了擴(kuò)展晌畅。

gzip壓縮

 /// gzip數(shù)據(jù)壓縮
    ///
    /// - 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數(shù)據(jù)解壓
    ///
    /// - 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!
    }
  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疹味,一起剝皮案震驚了整個(gè)濱河市耍目,隨后出現(xiàn)的幾起案子蚪黑,更是在濱河造成了極大的恐慌盅惜,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忌穿,死亡現(xiàn)場(chǎng)離奇詭異抒寂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掠剑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門屈芜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朴译,你說我怎么就攤上這事井佑。” “怎么了眠寿?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵躬翁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我盯拱,道長(zhǎng)盒发,這世上最難降的妖魔是什么例嘱? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮宁舰,結(jié)果婚禮上拼卵,老公的妹妹穿的比我還像新娘。我一直安慰自己蛮艰,他們只是感情好腋腮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著印荔,像睡著了一般低葫。 火紅的嫁衣襯著肌膚如雪详羡。 梳的紋絲不亂的頭發(fā)上仍律,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音实柠,去河邊找鬼水泉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窒盐,可吹牛的內(nèi)容都是我干的草则。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蟹漓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼炕横!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起葡粒,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤份殿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嗽交,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卿嘲,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年夫壁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拾枣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盒让,死狀恐怖梅肤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邑茄,我是刑警寧澤姨蝴,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站撩扒,受9級(jí)特大地震影響似扔,放射性物質(zhì)發(fā)生泄漏吨些。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一炒辉、第九天 我趴在偏房一處隱蔽的房頂上張望豪墅。 院中可真熱鬧,春花似錦黔寇、人聲如沸偶器。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屏轰。三九已至,卻和暖如春憋飞,著一層夾襖步出監(jiān)牢的瞬間霎苗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工榛做, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唁盏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓检眯,卻偏偏與公主長(zhǎng)得像厘擂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锰瘸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,103評(píng)論 1 32
  • 既然很在乎避凝,何必太清楚舞萄。 誰又曾知:相逢便是無可替代,相愛不必追根究底恕曲。 在時(shí)間的洪流中鹏氧,我就像一朵浮萍,循著生命...
    路兒閱讀 436評(píng)論 0 2
  • 最近的天空總是冰冷的神色,卻又不像冬天里的灰白茸俭。 這時(shí)候的天已經(jīng)黑嚴(yán)吊履,我還沒有回家。一個(gè)人呆呆地走在稻田間的小路上...
    麥特先生閱讀 2,080評(píng)論 0 2
  • 早霞映水浪輕揚(yáng)调鬓, 回落江堤壩漸長(zhǎng)艇炎。 再勝洪魔新業(yè)立, 凱旋將士系行囊腾窝。 驅(qū)車躡入臨朝幕缀踪, 豈料人民已兩行居砖。 魚水軍...
    神雕大俠o閱讀 105評(píng)論 0 0