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 是输入和输出缓冲区的大小,可选,默认为 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

    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

依赖

luajit

版本