lua-ffi-zlib
LuaJIT FFI 绑定到 zlib - zlib 压缩库
$ opm get taf2/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
是输入和输出缓冲区的大小,可选,默认为 16KBwindowBits
传递给inflateInit2()
,在大多数情况下应该保留为默认值。有关详细信息,请参阅 zlib 手册
发生错误时返回 false
和错误消息,否则返回 true
和最后的状态消息
deflateGzip
语法:ok, err = deflateGzip(input, output, chunk?, options?)
input
应该是一个函数,它接受一个块大小作为其唯一参数,并返回那么多未压缩数据的字节。output
将接收一个压缩数据的字符串作为其唯一参数,您可以随意处理它!chunk
是输入和输出缓冲区的大小,可选,默认为 16KBoptions
是一个传递给deflateInit2()
的选项表。有效的选项是 level、memLevel、strategy 和 windowBits,有关详细信息,请参阅 zlib 手册
发生错误时返回 false
和错误消息,否则返回 true
和最后的状态消息
示例
读取一个文件并输出解压缩后的版本。
大致相当于运行 gzip -dc file.gz
local table_insert = table.insert
local table_concat = table.concat
local zlib = require('lib.ffi-zlib')
local f = io.open(arg[1], "rb")
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)
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 错误代码的字符串表示形式
作者
hamishforbes
许可
mit