Lua 通过 alien 库调用 zlib 压缩/解压
来源:互联网 发布:java 数据库 连接框架 编辑:程序博客网 时间:2024/06/06 12:20
上次的文章(http://blog.csdn.net/kowity/article/details/7229815)讲述了上个在 Lua 中调用 zlib 压缩、解压功能的库。其实通过使用 Lua 的 alien 库就可以直接调用外部 dll 中的函数,并不需要专门为 Lua 写一个插件。
调用 zlib 压缩、解压的代码如下(参考了 LuaJIT 的部分实现方式(http://luajit.org/ext_ffi_tutorial.html)):
require("alien")local zlib = alien.load("zlib1")zlib.compressBound:types('long', 'long')zlib.compress2:types('int', 'pointer', 'pointer', 'string', 'long', 'int')zlib.uncompress:types('int', 'pointer', 'pointer', 'string', 'long')local function compress(txt) local n = zlib.compressBound(#txt) local buf = alien.buffer(n) local buflen = alien.buffer('0000') local res = zlib.compress2(buf, buflen, txt, #txt, 9) assert(res == 0) -- 返回压缩结果和压缩后的长度 return buf, alien.toulong(buflen:topointer())endlocal function uncompress(comp, comp_len, n) local buf = alien.buffer(n) local buflen = alien.buffer('0000') local res = zlib.uncompress(buf, buflen, comp, comp_len) assert(res == 0) -- 返回解压后在缓冲区中有效的部分 return tostr(buf, alien.toulong(buflen:topointer())) end-- 有符号数转无符号数function toUnsigned(num) local n if num < 0 then n = 256 + num else n = num end return nendfunction tostr(buf, len) local str for i = 1, len do -- Lua 把 buf 里面的数当成有符号数了, -- 导致读出来的有负数 local val = toUnsigned(buf[i]) if i == 1 then str = string.char(val) else str = str .. string.char(val) end end return strendlocal txt = string.rep("ab\0cd", 100)print("Uncompressed size: ", #txt)local c, c_len = compress(txt)print("Compressed size: ", c_len)local txt2 = uncompress(c, c_len, #txt)assert(txt2 == txt)
- Lua 通过 alien 库调用 zlib 压缩/解压
- Lua 通过 alien 库调用 zlib 压缩/解压
- zlib压缩解压库
- zlib压缩解压库
- lua使用zlib压缩和解压
- Qt调用zlib压缩解压文件
- 使用zlib压缩解压并导出lua接口
- zlib压缩库解压失败的问题
- zlib压缩解压
- iOS zlib 压缩解压
- Qt实现zip压缩和解压,编译、调用zlib和QuaZip动态库过程详解
- C调用Zlib库解压文件示例
- openresty lua zlib整合安装 让lua支持解压服务端压缩过的数据
- Zlib文件压缩和解压
- Zlib文件压缩和解压
- delphi Zlib 流压缩解压
- C++ zlib 压缩解压文件
- delphi Zlib 流压缩解压
- LINUX-Makefile全解析(编译体系)-基于Linux3.25内核
- oracle在c++编程中的接口
- discuz与ecshop实现整合和积分互通
- Android中使用系统桌面背景作为应用背景,支持拖动
- 生活
- Lua 通过 alien 库调用 zlib 压缩/解压
- HDOJ1098Ignatius's puzzle
- 防止表单重复提交
- HDU1108
- 默哀!!!
- Android APK反编译
- php 碎片一
- $(document).ready()的简短写法$()——设置当DOM完成加载的时候绑定的函数
- 关于模板类