Lua如何在内存中使用gzip对字符串进行压缩(不是zlib)?
2017-7-20 13:37:50
收藏:0
阅读:206
评论:1
给定一个字符串,如何在内存中使用gzip进行压缩?我正在使用Lua。
这听起来是一个简单的问题,但是有一个庞大的库列表。到目前为止,我尝试过的所有库要么已经停止开发,要么只能生成zlib压缩的字符串。在我的使用情况下,我需要gzip压缩,因为接受者需要这样。
作为一个测试,如果你将压缩后的字符串转储到一个文件,zcat 应该能够解压它。
我正在使用OpenResty,所以任何Lua库都可以使用。
(到目前为止,我唯一得到的解决方案是将字符串转储到文件中,调用 os.execute("gzip /tmp/example.txt"),然后将其读回来。不幸的是,这不是一个实际的解决方案。)
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

原来 zlib 与 gzip 差别不大,区别在于 gzip 增加了一个 header。
通过使用 lua-zlib,你可以获取这个 header,代码如下:
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解释:
以下是 deflate 函数的文档(来源:lua-zlib documentation):
如果未提供 compression_level,则使用 Z_DEFAULT_COMPRESSION(6)。 compression level 是 1-9 的数字,其中 zlib.BEST_SPEED 是 1,zlib.BEST_COMPRESSION 是 9。 返回一个“stream”函数,该函数会压缩(或缩小)所有传入的字符串。具体使用方法如下: string deflated, bool eof, int bytes_in, int bytes_out = stream(string input [, 'sync' | 'full' | 'finish']) 接受输入并缩小并返回其中一部分,可选地强制刷新。 “sync”刷新将强制将所有挂起的输出刷新到返回值并将输出对齐到字节边界,以便解压缩器可以获取到迄今为止可用的所有输入数据。刷新可能会降低某些压缩算法的压缩率,因此仅在必要时使用。 “full”刷新将像“sync”一样刷新所有输出,并重置压缩状态,以便在以前的压缩数据已经损坏或需要随机访问时从此处重新启动解压缩。过于频繁地使用 Z_FULL_FLUSH 可会严重降低压缩率。 “finish”刷新将强制处理所有挂起的输出,并导致流变得无法使用。任何将来尝试打印空字符串以外的内容的尝试都将导致以 IllegalState 开头的错误。 如果指定了“finish”,则 eof 结果为 true,否则为 false。 bytes_in 是传递给 stream 的输入字节数,bytes_out 是 deflated 字符串块中返回的字节数。