工程中添加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
相关推荐
标题中的“利用JAVASCRIPT实现GZIP压缩与解压缩”指的是在JavaScript环境中,我们可以使用原生或第三方库来处理GZIP格式的压缩和解压缩操作。GZIP是一种广泛使用的数据压缩格式,常用于减少网络传输的数据量,尤其是...
在JavaScript中,字符串默认使用UTF-16编码,因此在与gzip交互时,需要进行适当的转换。可以使用`TextEncoder`和`TextDecoder` API来完成这个任务: ```javascript var encoder = new TextEncoder(); var inputUtf8...
本项目着重介绍了如何使用pako库处理gzip压缩和解压缩,并且解决了中文字符在处理过程中的乱码问题。 gzip是一种广泛使用的数据压缩格式,它基于DEFLATE算法,常用于HTTP服务器上的文件传输以减少数据量。然而,...
1. 在接收端,先用`pako.ungzip()`函数对GZIP压缩的数据进行解压缩,恢复到加密后的Base64字符串。 2. 然后,使用`crypto-js`的`AES.decrypt()`方法,用相同的密钥解密这个Base64字符串,得到原始未加密数据。 在...
GZip是一种广泛使用的压缩格式,尤其在Web服务器和网络传输中扮演着重要角色。本篇文章将详细探讨如何使用GZip来解压文件,以及相关的文件和文件流操作。 首先,GZip是一种基于DEFLATE算法的压缩格式,它不仅能够...
#### 一、gzip简介与应用场景 `gzip`是一种广泛使用的文件压缩工具,它基于DEFLATE算法来实现文件压缩与解压缩的功能。`gzip`不仅可以用于命令行工具,还经常被集成到各种编程语言中,比如Java、Python等,以便...
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.util.zip包提供的GZIPOutputStream和GZIPInputStream类来实现的,这两个类分别用于数据的压缩和解压缩。Gzip是一种高效的压缩算法,广泛应用于网络传输和文件存储中,以减少数据占用的...
Java GZIP压缩与解压缩是Java开发中常用的技术,它可以将数据压缩到小于原始大小的尺寸,减少存储和传输所需的空间和时间。在本文中,我们将详细介绍Java GZIP压缩与解压缩的代码实例,并对其进行分析和解释。 GZIP...
4.1-4.3详细描述了压缩和解压缩的程序流程,包括压缩模块和解压缩模块的设计,以及主函数中的gzip压缩和ungzip解压缩代码。这些模块通过类的设计和流程控制实现了文件的压缩与解压缩。 5. 软件系统测试 测试部分...
在Java程序中,gzip压缩模块和ungzip解压缩模块分别实现了上述的压缩和解压缩流程。具体代码细节包括读取文件、创建缓冲区、调用压缩/解压缩算法、写入/读取数据等步骤。 5.软件系统测试 为了验证程序的正确性和...
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 软件系统测试...
在提供的代码示例中,定义了一个名为`ungzip`的方法,该方法接收三个参数:`path`(压缩文件的路径),`decomPath`(解压缩后文件的路径)和`overwrite`(一个布尔值,表示是否允许覆盖已存在的文件)。方法的核心...
前端堆栈的学习项目主要使用电子打字稿并进行React(当前为...添加用于gzip和ungzip的js zlib工具 添加进行vsc控制 为材质用户界面添加 -ui自动完成选择控制 添加 | 用于代码编辑和显示 Ctrl-F / Cmd-F Start searchin
3. **Gzip和Zlib格式的支持**:这些库通常也包含处理Gzip和Zlib格式的函数,比如`gzip`和`ungzip`,以及`compress`和`uncompress`。 4. **流处理**:为了处理大型数据,JavaScript版本的Zlib库可能支持流式处理,...
- -z, --gzip, --gunzip, --ungzip:使用gzip进行压缩或解压缩。 - -j, --bzip2:使用bzip2进行压缩或解压缩。 - -J:使用xz进行压缩或解压缩。 4. 其他常用选项: - -C directory, --directory=directory:...
在这个示例中,`CURLOPT_ENCODING` 选项设置为 "gzip" 会告诉cURL处理服务器返回的任何编码类型,包括gzip。 在处理`file_get_contents`时,你可能会遇到其他问题,比如超时或者网络不稳定。可以使用`set_time_...
1.任何数据类型到字节流的转换 2.字节流到任何数据类型的转换 3.字符串按各种格式编码,解码 4.各种进制的转换,一键全转,当然还有反转 小工具,大用途! 工控代码开发,TCP通讯,字节流调试的利器