.Zlib 副檔名解壓縮成 NSData

 

.Zlib 副檔名解壓縮成 NSData,再轉換成JSON格式。

新增一個NSData category,在.m寫入以下code

#import <zlib.h>

NSString* const IDZGunzipErrorDomain = @"com.litv.mobile.as.lep";

@implementation NSData (Decompressing)

- (NSData*)gunzip:(NSError *__autoreleasing *)error

{

    /*

     * A minimal gzip header/trailer is 18 bytes long.

     * See: RFC 1952 http://www.gzip.org/zlib/rfc-gzip.html

     */

    if(self.length < 18)

    {

        if(error)

            *error = [NSError errorWithDomain:IDZGunzipErrorDomain code:Z_DATA_ERROR userInfo:nil];

        return nil;

    }

    z_stream zStream;

    memset(&zStream, 0, sizeof(zStream));

    /*

     * 16 is a magic number that allows inflate to handle gzip

     * headers.

     */

    int iResult = inflateInit2(&zStream, 16);

    if(iResult != Z_OK)

    {

        if(error)

            *error = [NSError errorWithDomain:IDZGunzipErrorDomain code:iResult userInfo:nil];

        return nil;

    }

    /*

     * The last four bytes of a gzipped file/buffer contain the the number

     * of uncompressed bytes expressed as a 32-bit little endian unsigned integer.

     * See: RFC 1952 http://www.gzip.org/zlib/rfc-gzip.html

     */

    UInt32 nUncompressedBytes = *(UInt32*)(self.bytes + self.length - 4);

    NSMutableData* gunzippedData = [NSMutableData dataWithLength:nUncompressedBytes];

    

    zStream.next_in = (Bytef*)self.bytes;

    zStream.avail_in = self.length;

    zStream.next_out = (Bytef*)gunzippedData.bytes;

    zStream.avail_out = gunzippedData.length;

    

    iResult = inflate(&zStream, Z_FINISH);

    if(iResult != Z_STREAM_END)

    {

        if(error)

            *error = [NSError errorWithDomain:IDZGunzipErrorDomain code:iResult userInfo:nil];

        gunzippedData = nil;

    }

    inflateEnd(&zStream);

    return gunzippedData;

}

.h加入以下

/**

 category on NSData,decompressing .zlib to NSData

 @param error

 @returns NSData,un-zlib NSData

 */

- (NSData*)gunzip:(NSError *__autoreleasing *)error;

如何運用

        //指到特定的路徑,轉成NSData在吐給 gunzip...
        NSData *rawData = [NSData dataWithContentsOfFile:filePath];

        NSError *err=nil;

        //decompress processing...

        NSData *decompressZlibData = [rawData gunzip:&err];
          
        //之後再把NSData序列化成JSON格式...
        .
        .

ref:

http://iosdeveloperzone.com/2013/03/14/code-snippet-decompressing-a-gzipped-buffer/

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

w

連結到 %s