Ruby 2.4

Zlib

module Zlib

该模块提供对 zlib 库的访问。Zlib 旨在成为一种便携式,免费,通用,法律上不受阻碍 - 即不受任何专利保护的无损数据压缩库,可用于几乎任何计算机硬件和操作系统。

zlib 压缩库提供了内存中的压缩和解压缩功能,包括未压缩数据的完整性检查。

RFC 1950 中描述了 zlib 压缩数据格式,它是 RFC 1951中描述的 deflate 流的封装。

该库还支持以类似于 IO 的界面读写gzip(.gz)格式的文件。gzip 格式在 RFC 1952中有介绍,它也是 deflate 流的封装。

zlib 格式被设计为紧凑且快速,以用于存储器和通信通道。gzip 格式是为文件系统上的单文件压缩而设计的,比 zlib 具有更大的头部以维护目录信息,并使用与 zlib 不同的更慢的检查方法。

有关 zlib 的更多信息,请参见您的系统的 zlib.h

示例用法

使用包装来使用默认参数压缩字符串非常简单:

require "zlib" data_to_compress = File.read("don_quixote.txt") puts "Input size: #{data_to_compress.size}" #=> Input size: 2347740 data_compressed = Zlib::Deflate.deflate(data_to_compress) puts "Compressed size: #{data_compressed.size}" #=> Compressed size: 887238 uncompressed_data = Zlib::Inflate.inflate(data_compressed) puts "Uncompressed data is: #{uncompressed_data}" #=> Uncompressed data is: The Project Gutenberg EBook of Don Quixote...

类树

  • Zlib::Deflate

- [Zlib::StreamEnd](zlib/streamend)

- [Zlib::NeedDict](zlib/needdict)

- [Zlib::DataError](zlib/dataerror)

- [Zlib::StreamError](zlib/streamerror)

- [Zlib::MemError](zlib/memerror)

- [Zlib::BufError](zlib/buferror)

- [Zlib::VersionError](zlib/versionerror)

(如果你有 GZIP_SUPPORT)

  • Zlib::GzipReader

- [Zlib::GzipFile::LengthError](zlib/gzipfile/lengtherror)

- [Zlib::GzipFile::CRCError](zlib/gzipfile/crcerror)

- [Zlib::GzipFile::NoFooter](zlib/gzipfile/nofooter)

常量

ASCII

通过 deflate 表示文本数据。

注意:zlib 1.2.2中的基础常量 Z_ASCII 不赞成 Z_TEXT。新的应用程序不应该使用这个常量。

See Zlib::ZStream#data_type.

BEST_COMPRESSION

最慢的压缩级别,但节省空间最佳。

BEST_SPEED

最快的压缩级别,但节省空间最少。

BINARY

按照放气猜测来表示二进制数据。

See Zlib::ZStream#data_type.

DEFAULT_COMPRESSION

默认压缩级别,这是空间和时间之间的良好折衷

DEFAULT_STRATEGY

用于普通数据的默认 deflate 策略。

DEF_MEM_LEVEL

分配 zlib 的默认内存级别放气压缩状态。

FILTERED

为过滤器(或预测器)生成的数据放气策略。FILTEREDt的作用是强制更多的霍夫曼代码和更少的字符串匹配; 它在tDEFAULT_STRATEGYt和HUFFMAN_ONLYt之间有点中间。经过滤的数据主要由小的值组成,并且分布有些随机。

FINISH

处理所有待处理的输入并刷新待处理的输出。

FIXED

防止动态霍夫曼编码使用的放气策略,允许更简单的专用应用解码器。

FULL_FLUSH

像 SYNC_FLUSH 一样刷新所有输出,并且压缩状态被重置,以便如果先前的压缩数据已经被损坏或者如果需要随机访问,解压缩可以从这一点重新开始。像 SYNC_FLUSH 一样,使用 FULL_FLUSH 常常会严重降低压缩率。

HUFFMAN_ONLY

仅使用霍夫曼码的放气策略(无字符串匹配)。

MAX_MEM_LEVEL

分配 zlib 的最大内存级别放气压缩状态。

MAX_WBITS

zlib 历史缓冲区的最大大小。请注意,zlib 允许较大的值启用不同的充气模式。有关详细信息,请参阅 Zlib :: Inflate.new。

NO_COMPRESSION

没有压缩,通过数据不变。使用它将预压缩数据附加到 deflate 流。

NO_FLUSH

NO_FLUSH 是默认的刷新方法,允许 deflate 在产生输出之前决定要累积多少数据以最大化压缩。

OS_AMIGA

OS code for Amiga hosts

OS_ATARI

OS code for Atari hosts

OS_CODE

The OS code of current host

OS_CPM

OS code for CP/M hosts

OS_MACOS

OS code for Mac OS hosts

OS_MSDOS

OS code for MSDOS hosts

OS_OS2

OS code for OS2 hosts

OS_QDOS

OS code for QDOS hosts

OS_RISCOS

OS code for RISC OS hosts

OS_TOPS20

OS code for TOPS-20 hosts

OS_UNIX

OS code for UNIX hosts

OS_UNKNOWN

未知主机的操作系统代码

OS_VMCMS

VM OS 主机的 OS 代码

OS_VMS

VMS 主机的操作系统代码

OS_WIN32

Win32主机的操作系统代码

OS_ZSYSTEM

Z 系统主机的 OS 代码

RLE

Deflate 设计的压缩策略几乎与 HUFFMAN_ONLY 一样快,但可以更好地压缩 PNG 图像数据。

SYNC_FLUSH

SYNC_FLUSH 方法将所有挂起的输出刷新到输出缓冲区,并且输出在字节边界上对齐。刷新可能会降低压缩率,因此应仅在必要时使用压缩,例如在网络流的请求或响应边界处。

TEXT

通过 deflate 表示文本数据。

See Zlib::ZStream#data_type.

UNKNOWN

通过 deflate表示未知的数据类型。

See Zlib::ZStream#data_type.

VERSION

The Ruby/zlib version string.

ZLIB_VERSION

表示 zlib.h 版本的字符串

公共类方法

adler32(string, adler) Show source

计算 Adler-32校验和string,并返回更新值adler。如果string省略,则返回 Adler-32的初始值。如果adler省略,则假定给出初始值adler

用法示例:

require "zlib" data = "foo" puts "Adler32 checksum: #{Zlib.adler32(data).to_s(16)}" #=> Adler32 checksum: 2820145

static VALUE rb_zlib_adler32(int argc, VALUE *argv, VALUE klass) { return do_checksum(argc, argv, adler32 }

adler32_combine(adler1, adler2, len2) Show source

将两个 Adler-32检查值合并为一个。alder1是第一个 Adler-32值,adler2是第二个 Adler-32值。len2是用于生成的字符串的长度adler2

static VALUE rb_zlib_adler32_combine(VALUE klass, VALUE adler1, VALUE adler2, VALUE len2) { return ULONG2NUM( adler32_combine(NUM2ULONG(adler1), NUM2ULONG(adler2), NUM2LONG(len2)) }

crc32(string, crc) Show source

计算 CRC 校验和string,并返回更新值crc。如果string省略,则返回 CRC 初始值。如果crc省略,则假定给出初始值crc

FIXME: expression.

static VALUE rb_zlib_crc32(int argc, VALUE *argv, VALUE klass) { return do_checksum(argc, argv, crc32 }

crc32_combine(crc1, crc2, len2) Show source

将两个 CRC-32校验值合并为一个。crc1是第一个 CRC-32值,crc2是第二个 CRC-32值。len2是用于生成的字符串的长度crc2

static VALUE rb_zlib_crc32_combine(VALUE klass, VALUE crc1, VALUE crc2, VALUE len2) { return ULONG2NUM( crc32_combine(NUM2ULONG(crc1), NUM2ULONG(crc2), NUM2LONG(len2)) }

crc_table() Show source

返回用于计算 CRC 校验和的表作为数组。

static VALUE rb_zlib_crc_table(VALUE obj) { #if !defined(HAVE_TYPE_Z_CRC_T) /* z_crc_t is defined since zlib-1.2.7. */ typedef unsigned long z_crc_t; #endif const z_crc_t *crctbl; VALUE dst; int i; crctbl = get_crc_table( dst = rb_ary_new2(256 for (i = 0; i < 256; i++) { rb_ary_push(dst, rb_uint2inum(crctbl[i]) } return dst; }

deflate(string, level) Show source

Zlib::Deflate.deflate(string, level)

压缩给定的string。级别的有效值为 Zlib :: NO_COMPRESSION,Zlib :: BEST_SPEED,Zlib :: BEST_COMPRESSION,Zlib :: DEFAULT_COMPRESSION 或从0到9的整数。

该方法几乎等同于以下代码:

def deflate(string, level) z = Zlib::Deflate.new(level) dst = z.deflate(string, Zlib::FINISH) z.close dst end

See also ::inflate

static VALUE rb_deflate_s_deflate(int argc, VALUE *argv, VALUE klass) { struct zstream z; VALUE src, level, dst, args[2]; int err, lev; rb_scan_args(argc, argv, "11", &src, &level lev = ARG_LEVEL(level StringValue(src zstream_init_deflate(&z err = deflateInit(&z.stream, lev if (err != Z_OK) { raise_zlib_error(err, z.stream.msg } ZSTREAM_READY(&z args[0] = (VALUE)&z; args[1] = src; dst = rb_ensure(deflate_run, (VALUE)args, zstream_end, (VALUE)&z OBJ_INFECT(dst, src return dst; }

gunzip(src) → String Show source

解码给定的 gzip string

该方法几乎等同于以下代码:

def gunzip(string) sio = StringIO.new(string) gz = Zlib::GzipReader.new(sio, encoding: Encoding::ASCII_8BIT) gz.read ensure gz&.close end

See also ::gzip

static VALUE zlib_gunzip(VALUE klass, VALUE src) { struct gzfile gz0; struct gzfile *gz = &gz0; int err; VALUE dst; StringValue(src gzfile_init(gz, &inflate_funcs, zlib_gunzip_end err = inflateInit2(&gz->z.stream, -MAX_WBITS if (err != Z_OK) { raise_zlib_error(err, gz->z.stream.msg } gz->io = Qundef; gz->z.input = src; ZSTREAM_READY(&gz->z gzfile_read_header(gz dst = zstream_detach_buffer(&gz->z gzfile_calc_crc(gz, dst if (!ZSTREAM_IS_FINISHED(&gz->z)) { rb_raise(cGzError, "unexpected end of file" } if (NIL_P(gz->z.input)) rb_raise(cNoFooter, "footer is not found" gzfile_check_footer(gz return dst; }

gzip(src, level: nil, strategy: nil) → String Show source

Gzip 给定string。级别的有效值为 Zlib :: NO_COMPRESSION,Zlib :: BEST_SPEED,Zlib :: BEST_COMPRESSION,Zlib :: DEFAULT_COMPRESSION(默认值)或0到9的整数。

该方法几乎等同于以下代码:

def gzip(string, level: nil, strategy: nil) sio = StringIO.new sio.binmode gz = Zlib::GzipWriter.new(sio, level, strategy) gz.write(string) gz.close sio.string end

See also ::gunzip

static VALUE zlib_s_gzip(int argc, VALUE *argv, VALUE klass) { struct gzfile gz0; struct gzfile *gz = &gz0; long len; int err; VALUE src, opts, level=Qnil, strategy=Qnil; if (OPTHASH_GIVEN_P(opts)) { ID keyword_ids[2]; VALUE kwargs[2]; keyword_ids[0] = id_level; keyword_ids[1] = id_strategy; rb_get_kwargs(opts, keyword_ids, 0, 2, kwargs if (kwargs[0] != Qundef) { level = kwargs[0]; } if (kwargs[1] != Qundef) { strategy = kwargs[1]; } } rb_scan_args(argc, argv, "10", &src StringValue(src gzfile_init(gz, &deflate_funcs, zlib_gzip_end gz->level = ARG_LEVEL(level err = deflateInit2(&gz->z.stream, gz->level, Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, ARG_STRATEGY(strategy) if (err != Z_OK) { raise_zlib_error(err, gz->z.stream.msg } ZSTREAM_READY(&gz->z gzfile_make_header(gz len = RSTRING_LEN(src if (len > 0) { Bytef *ptr = (Bytef *)RSTRING_PTR(src gz->crc = checksum_long(crc32, gz->crc, ptr, len zstream_run(&gz->z, ptr, len, Z_NO_FLUSH } gzfile_close(gz, 0 return zstream_detach_buffer(&gz->z }

inflate(string) Show source

Zlib::Inflate.inflate(string)

解压缩string。如果解压缩需要预设字典,则引发 Zlib :: NeedDict 异常。

该方法几乎等同于以下代码:

def inflate(string) zstream = Zlib::Inflate.new buf = zstream.inflate(string) zstream.finish zstream.close buf end

See also ::deflate

static VALUE rb_inflate_s_inflate(VALUE obj, VALUE src) { struct zstream z; VALUE dst, args[2]; int err; StringValue(src zstream_init_inflate(&z err = inflateInit(&z.stream if (err != Z_OK) { raise_zlib_error(err, z.stream.msg } ZSTREAM_READY(&z args[0] = (VALUE)&z; args[1] = src; dst = rb_ensure(inflate_run, (VALUE)args, zstream_end, (VALUE)&z OBJ_INFECT(dst, src return dst; }

zlib_version() Show source

返回表示 zlib 库版本的字符串。

static VALUE rb_zlib_version(VALUE klass) { VALUE str; str = rb_str_new2(zlibVersion() OBJ_TAINT(str /* for safe */ return str; }