`
zxs19861202
  • 浏览: 914723 次
  • 性别: Icon_minigender_1
  • 来自: 湖北—》上海
社区版块
存档分类
最新评论

ios 中gzip与unGzip

    博客分类:
  • ios
 
阅读更多

工程中添加libz.dylib

.h文件如下:

 

#import <Foundation/Foundation.h>

#import "zlib.h"

 

@interface LFCGzipUtility : NSObject{

    

    

}

 

+(NSData*)gzipData:(NSData*)pUncompressedData;  //压缩

 

+(NSData*) ungzipData:(NSData *)compressedData;  //解压缩

 

 

@end

 

.m文件如下:

 

#import "LFCGzipUtility.h"

#import "zlib.h"

 

@implementation LFCGzipUtility{

    

    

}

 

 

 

 

+(NSData*) gzipData: (NSData*)pUncompressedData

{

    

    if (!pUncompressedData || [pUncompressedData length] == 0)

    {

        NSLog(@"%s: Error: Can't compress an empty or null NSData object.", __func__);

        return nil;

    }

    

    z_stream zlibStreamStruct;

    zlibStreamStruct.zalloc    = Z_NULL; // Set zalloc, zfree, and opaque to Z_NULL so

    zlibStreamStruct.zfree     = Z_NULL; // that when we call deflateInit2 they will be

    zlibStreamStruct.opaque    = Z_NULL; // updated to use default allocation functions.

    zlibStreamStruct.total_out = 0; // Total number of output bytes produced so far

    zlibStreamStruct.next_in   = (Bytef*)[pUncompressedData bytes]; // Pointer to input bytes

    zlibStreamStruct.avail_in  = [pUncompressedData length]; // Number of input bytes left to process

    

    int initError = deflateInit2(&zlibStreamStruct, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY);

    if (initError != Z_OK)

    {

        NSString *errorMsg = nil;

        switch (initError)

        {

            case Z_STREAM_ERROR:

                errorMsg = @"Invalid parameter passed in to function.";

                break;

            case Z_MEM_ERROR:

                errorMsg = @"Insufficient memory.";

                break;

            caseZ_VERSION_ERROR:

                errorMsg = @"The version of zlib.h and the version of the library linked do not match.";

                break;

            default:

                errorMsg = @"Unknown error code.";

                break;

        }

        NSLog(@"%s: deflateInit2() Error: \"%@\" Message: \"%s\"", __func__, errorMsg, zlibStreamStruct.msg);

        return nil;

    }

    

    

    NSMutableData *compressedData = [NSMutableData dataWithLength:[pUncompressedData length] * 1.01 + 12];

    

    int deflateStatus;

    do

    {

        // Store location where next byte should be put in next_out

        zlibStreamStruct.next_out = [compressedData mutableBytes] + zlibStreamStruct.total_out;

        

        zlibStreamStruct.avail_out = [compressedData length] - zlibStreamStruct.total_out;

        

        deflateStatus = deflate(&zlibStreamStruct, Z_FINISH);

        

    } while ( deflateStatus == Z_OK );

    

    // Check for zlib error and convert code to usable error message if appropriate

    if (deflateStatus != Z_STREAM_END)

    {

        NSString *errorMsg = nil;

        switch (deflateStatus)

        {

            case Z_ERRNO:

                errorMsg = @"Error occured while reading file.";

                break;

            case Z_STREAM_ERROR:

                errorMsg = @"The stream state was inconsistent (e.g., next_in or next_out was NULL).";

                break;

            case Z_DATA_ERROR:

                errorMsg = @"The deflate data was invalid or incomplete.";

                break;

            case Z_MEM_ERROR:

                errorMsg = @"Memory could not be allocated for processing.";

                break;

            case Z_BUF_ERROR:

                errorMsg = @"Ran out of output buffer for writing compressed bytes.";

                break;

            caseZ_VERSION_ERROR:

                errorMsg = @"The version of zlib.h and the version of the library linked do not match.";

                break;

            default:

                errorMsg = @"Unknown error code.";

                break;

        }

        NSLog(@"%s: zlib error while attempting compression: \"%@\" Message: \"%s\"", __func__, errorMsg, zlibStreamStruct.msg);

        

        // Free data structures that were dynamically created for the stream.

        deflateEnd(&zlibStreamStruct);

        

        return nil;

    }

    // Free data structures that were dynamically created for the stream.

    deflateEnd(&zlibStreamStruct);

    [compressedData setLength: zlibStreamStruct.total_out];

    NSLog(@"%s: Compressed file from %d KB to %d KB", __func__, [pUncompressedData length]/1024, [compressedData length]/1024);

    

    return compressedData;

}

 

 

 

+(NSData *)ungzipData:(NSData *)compressedData

{

    if ([compressedData length] == 0)

        return compressedData;

    

    unsigned full_length = [compressedData length];

    unsigned half_length = [compressedData length] / 2;

    

    NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length];

    BOOL done = NO;

    int status;

    

    z_stream strm;

    strm.next_in = (Bytef *)[compressedData bytes];

    strm.avail_in = [compressedData length];

    strm.total_out = 0;

    strm.zalloc = Z_NULL;

    strm.zfree = Z_NULL;

    if (inflateInit2(&strm, (15+32)) != Z_OK)

        return nil;

    

    while (!done) {

        // Make sure we have enough room and reset the lengths.

        if (strm.total_out >= [decompressed length]) {

            [decompressed increaseLengthBy: half_length];

        }

        strm.next_out = [decompressed mutableBytes] + strm.total_out;

        strm.avail_out = [decompressed length] - strm.total_out;

        // Inflate another chunk.

        status = inflate (&strm, Z_SYNC_FLUSH);

        if (status == Z_STREAM_END) {

            done = YES;

        } else if (status != Z_OK) {

            break;

        }

    }

    

    if (inflateEnd (&strm) != Z_OK)

        return nil;

    // Set real length.

    if (done) {

        [decompressed setLength: strm.total_out];

        return [NSData dataWithData: decompressed];

    }

    returnnil;

}

 

 

 

 

 

 

@end

 

 

分享到:
评论

相关推荐

    pako gzip 压缩和解压缩(支持中文)

    在JavaScript中,字符串默认使用UTF-16编码,因此在与gzip交互时,需要进行适当的转换。可以使用`TextEncoder`和`TextDecoder` API来完成这个任务: ```javascript var encoder = new TextEncoder(); var inputUtf8...

    利用JAVASCRIPT即你想那个GZIP压缩与解压缩

    标题中的“利用JAVASCRIPT实现GZIP压缩与解压缩”指的是在JavaScript环境中,我们可以使用原生或第三方库来处理GZIP格式的压缩和解压缩操作。GZIP是一种广泛使用的数据压缩格式,常用于减少网络传输的数据量,尤其是...

    pako gzip 压缩和解压缩(支持中文).rar

    本项目着重介绍了如何使用pako库处理gzip压缩和解压缩,并且解决了中文字符在处理过程中的乱码问题。 gzip是一种广泛使用的数据压缩格式,它基于DEFLATE算法,常用于HTTP服务器上的文件传输以减少数据量。然而,...

    Javascript 实现Base64 + GZIP + AES 加解密

    1. 在接收端,先用`pako.ungzip()`函数对GZIP压缩的数据进行解压缩,恢复到加密后的Base64字符串。 2. 然后,使用`crypto-js`的`AES.decrypt()`方法,用相同的密钥解密这个Base64字符串,得到原始未加密数据。 在...

    使用GZip解压文件

    GZip是一种广泛使用的压缩格式,尤其在Web服务器和网络传输中扮演着重要角色。本篇文章将详细探讨如何使用GZip来解压文件,以及相关的文件和文件流操作。 首先,GZip是一种基于DEFLATE算法的压缩格式,它不仅能够...

    gzip实现代码

    #### 一、gzip简介与应用场景 `gzip`是一种广泛使用的文件压缩工具,它基于DEFLATE算法来实现文件压缩与解压缩的功能。`gzip`不仅可以用于命令行工具,还经常被集成到各种编程语言中,比如Java、Python等,以便...

    SharpCompressDll0.24.zip

    SharpCompress is a compression library for NET Standard 1.0 that can unrar, decompress 7zip, decompress xz, zip/unzip, tar/untar lzip/unlzip, bzip2/unbzip2 and gzip/ungzip with forward-only reading ...

    Java压缩Gzip

    Java中的Gzip压缩是通过Java.util.zip包提供的GZIPOutputStream和GZIPInputStream类来实现的,这两个类分别用于数据的压缩和解压缩。Gzip是一种高效的压缩算法,广泛应用于网络传输和文件存储中,以减少数据占用的...

    Java GZIP压缩与解压缩代码实例

    Java GZIP压缩与解压缩是Java开发中常用的技术,它可以将数据压缩到小于原始大小的尺寸,减少存储和传输所需的空间和时间。在本文中,我们将详细介绍Java GZIP压缩与解压缩的代码实例,并对其进行分析和解释。 GZIP...

    文件压缩与解压缩实践docx

    4.1-4.3详细描述了压缩和解压缩的程序流程,包括压缩模块和解压缩模块的设计,以及主函数中的gzip压缩和ungzip解压缩代码。这些模块通过类的设计和流程控制实现了文件的压缩与解压缩。 5. 软件系统测试 测试部分...

    文件压缩与解压缩实践(源代码+论文)

    在Java程序中,gzip压缩模块和ungzip解压缩模块分别实现了上述的压缩和解压缩流程。具体代码细节包括读取文件、创建缓冲区、调用压缩/解压缩算法、写入/读取数据等步骤。 5.软件系统测试 为了验证程序的正确性和...

    毕设项目:文件压缩与解压缩实践(JAVA+源代码+论文)

    3.3 程序中各个类的初步定义 7 4 详细设计和实现 8 4.1 压缩的程序流程 8 4.2 解压缩的程序流程 9 4.3 主函数代码 10 4.3.1 gzip压缩模块代码 10 4.3.2 ungzip解压缩模块代码 11 4.4 程序界面设计 12 5 软件系统测试...

    C#实现解压GZip文件的方法

    在提供的代码示例中,定义了一个名为`ungzip`的方法,该方法接收三个参数:`path`(压缩文件的路径),`decomPath`(解压缩后文件的路径)和`overwrite`(一个布尔值,表示是否允许覆盖已存在的文件)。方法的核心...

    sketch_coding:编码草图应用程序(开发中)

    前端堆栈的学习项目主要使用电子打字稿并进行React(当前为...添加用于gzip和ungzip的js zlib工具 添加进行vsc控制 为材质用户界面添加 -ui自动完成选择控制 添加 | 用于代码编辑和显示 Ctrl-F / Cmd-F Start searchin

    js 版本zlib代码

    3. **Gzip和Zlib格式的支持**:这些库通常也包含处理Gzip和Zlib格式的函数,比如`gzip`和`ungzip`,以及`compress`和`uncompress`。 4. **流处理**:为了处理大型数据,JavaScript版本的Zlib库可能支持流式处理,...

    tar命令详解.pdf

    - -z, --gzip, --gunzip, --ungzip:使用gzip进行压缩或解压缩。 - -j, --bzip2:使用bzip2进行压缩或解压缩。 - -J:使用xz进行压缩或解压缩。 4. 其他常用选项: - -C directory, --directory=directory:...

    解析PHP中的file_get_contents获取远程页面乱码的问题

    在这个示例中,`CURLOPT_ENCODING` 选项设置为 "gzip" 会告诉cURL处理服务器返回的任何编码类型,包括gzip。 在处理`file_get_contents`时,你可能会遇到其他问题,比如超时或者网络不稳定。可以使用`set_time_...

    字节流与各类型数据的互转工具

    1.任何数据类型到字节流的转换 2.字节流到任何数据类型的转换 3.字符串按各种格式编码,解码 4.各种进制的转换,一键全转,当然还有反转 小工具,大用途! 工控代码开发,TCP通讯,字节流调试的利器

Global site tag (gtag.js) - Google Analytics