Lua:如何在内存中gzip一个字符串(gzip,而不是zlib)?

问题描述:

给定一个字符串,如何使用gzip将其压缩到内存中?我正在使用Lua。Lua:如何在内存中gzip一个字符串(gzip,而不是zlib)?


这听起来像一个简单的问题,但有一个巨大的库列表。到目前为止,我所尝试的所有内容都已经死亡,或者我只能生成zlib压缩字符串。在我的使用案例中,我需要gzip压缩,就像接收器预期的那样。

作为测试,如果将压缩字符串转储到文件,zcat应该能够解压缩它。

我使用OpenResty,所以任何Lua库都应该没问题。

(即我走到这一步工作,唯一的解决办法是转储字符串文件,调用os.execute("gzip /tmp/example.txt")和读回。不幸的是,这不是一个可行的解决方案。)

+1

我觉得gzip的== zlib的,有头 – mksteve

+0

@mksteve从什么我读过,我认为你是对的。问题只是如何让库设置标题。 –

原来,zlib的是离gzip不远。区别在于gzip有一个额外的头文件。

为了得到这个标题,你可以使用lua-zlib这样的:

local zlib = require "zlib" 

-- input: string 
-- output: string compressed with gzip 
function compress(str) 
    local level = 5 
    local windowSize = 15+16 
    return zlib.deflate(level, windowSize)(str, "finish") 
end 

说明:

  • 放气的第二个参数是窗口大小。它确保写一个gzip头文件。如果你省略参数,你会得到一个zlib压缩字符串。
  • 级别是gzip压缩级(1 =最差到9 =最好)

这里是放气的文档(来源:lua-zlib documentation):

功能流= zlib.deflate( [INT compression_level],[INT WINDOW_SIZE])

If no compression_level is provided uses Z_DEFAULT_COMPRESSION (6), 
compression level is a number from 1-9 where zlib.BEST_SPEED is 1 
and zlib.BEST_COMPRESSION is 9. 

Returns a "stream" function that compresses (or deflates) all 
strings passed in. Specifically, use it as such: 

string deflated, bool eof, int bytes_in, int bytes_out = 
     stream(string input [, 'sync' | 'full' | 'finish']) 

    Takes input and deflates and returns a portion of it, 
    optionally forcing a flush. 

    A 'sync' flush will force all pending output to be flushed to 
    the return value and the output is aligned on a byte boundary, 
    so that the decompressor can get all input data available so 
    far. Flushing may degrade compression for some compression 
    algorithms and so it should be used only when necessary. 

    A 'full' flush will flush all output as with 'sync', and the 
    compression state is reset so that decompression can restart 
    from this point if previous compressed data has been damaged 
    or if random access is desired. Using Z_FULL_FLUSH too often 
    can seriously degrade the compression. 

    A 'finish' flush will force all pending output to be processed 
    and results in the stream become unusable. Any future 
    attempts to print anything other than the empty string will 
    result in an error that begins with IllegalState. 

    The eof result is true if 'finish' was specified, otherwise 
    it is false. 

    The bytes_in is how many bytes of input have been passed to 
    stream, and bytes_out is the number of bytes returned in 
    deflated string chunks.