lua-ffi-zlib
Luajit FFI 绑定用于 zlib
$ opm get hamishforbes/lua-ffi-zlib
lua-ffi-zlib
一个使用 LuaJIT 的 FFI 功能访问 zlib 的 Lua 模块。主要用于 OpenResty 中,以允许操作 gzip 编码的 HTTP 响应。
方法
提供用于简单压缩或解压缩 gzip 数据的基本方法
inflateGzip
语法:ok, err = inflateGzip(input, output, chunk?, windowBits?)
input
应该是一个函数,它接受一个块大小作为其唯一参数,并返回该大小的 gzip 流字节数。output
将接收一个解压缩数据的字符串作为其唯一参数,您可以随意处置它!chunk
是输入和输出缓冲区的尺寸,可选,默认为 16KB。windowBits
传递给inflateInit2()
,大多数情况下应该保留为默认值。有关详细信息,请参阅 zlib 手册。
出错时返回 false
和错误消息,否则返回 true
和最后的状态消息。
deflateGzip
语法:ok, err = deflateGzip(input, output, chunk?, options?)
input
应该是一个函数,它接受一个块大小作为其唯一参数,并返回该大小的未压缩数据的字节数。output
将接收一个压缩数据的字符串作为其唯一参数,您可以随意处置它!chunk
是输入和输出缓冲区的尺寸,可选,默认为 16KB。options
是一个传递给deflateInit2()
的选项表。有效的选项包括 level、memLevel、strategy 和 windowBits,有关详细信息,请参阅 zlib 手册。
出错时返回 false
和错误消息,否则返回 true
和最后的状态消息。
示例
读取文件并输出解压缩版本。
大致相当于运行 gzip -dc file.gz > out_file | tee
local table_insert = table.insert
local table_concat = table.concat
local zlib = require('lib.ffi-zlib')
local f = io.open(arg[1], "rb")
local out_f = io.open(arg[2], "w")
local input = function(bufsize)
-- Read the next chunk
local d = f:read(bufsize)
if d == nil then
return nil
end
return d
end
local output_table = {}
local output = function(data)
table_insert(output_table, data)
local ok, err = out_f:write(data)
if not ok then
-- abort decompression when error occurs
return nil, err
end
end
-- Decompress the data
local ok, err = zlib.inflateGzip(input, output)
if not ok then
print(err)
return
end
local decompressed = table_concat(output_table,'')
print(decompressed)
高级用法
还提供了一些其他方法用于高级用法。其中一些方法直接映射到 zlib 库本身中的函数,请参阅 手册 以获取完整详细信息。其他方法是更低级的实用程序函数。
createStream
语法:stream, inbuf, outbuf = createStream(bufsize)
返回一个 z_stream 结构、输入缓冲区和长度为 bufsize
的输出缓冲区。
initInflate
语法:ok = initInflate(stream, windowBits?)
使用给定的流调用 zlib 的 inflateInit2,默认情况下会自动检测头部。
initDeflate
语法:ok = initDeflate(stream, options?)
使用给定的流调用 zlib 的 deflateInit2。options
是一个可选的表,可以设置 level、memLevel、strategy 和 windowBits。
deflate
语法:ok, err = deflate(input, output, bufsize, stream, inbuf, outbuf)
input
是一个函数,它接受一个块大小参数,并返回最多该大小的输入字节。output
是一个函数,它接受一个输出数据的字符串参数。bufsize
是输出缓冲区的长度。inbuf
cdata 输入缓冲区。outpuf
ccdata 输出缓冲区。
此函数将循环,直到所有输入数据都被消耗(input
返回 nil)或发生错误。然后它将清理流并返回一个错误代码。
inflate
语法:ok, err = inflate(input, output, bufsize, stream, inbuf, outbuf)
input
是一个函数,它接受一个块大小参数,并返回最多该大小的输入字节。output
是一个函数,它接受一个输出数据的字符串参数。bufsize
是输出缓冲区的长度。inbuf
cdata 输入缓冲区。outpuf
ccdata 输出缓冲区。
此函数将循环,直到所有输入数据都被消耗(input
返回 nil)或发生错误。然后它将清理流并返回一个错误代码。
adler
语法:chksum = adler(str, chksum?)
计算字符串的 adler32 校验和,如果提供,则更新现有的校验和。
crc
语法:chksum = crc(str, chksum?)
计算字符串的 crc32 校验和,如果提供,则更新现有的校验和。
zlib_err
语法:err = zlib_err(code)
返回 zlib 错误代码的字符串表示形式。
作者
Hamish Forbes
许可证
mit
依赖项
luajit
版本
-
Luajit FFI 绑定用于 zlib 2023-08-10 21:32:04
-
Luajit FFI 绑定用于 zlib 2020-01-27 08:47:55
-
Luajit FFI 绑定用于 zlib 2019-05-28 10:05:56
-
Luajit 绑定用于 zlib 2018-03-23 11:46:22