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

版本