安装openresty扩展 lpack库,openrestylpack
安装openresty扩展 lpack库,openrestylpack
lpack包简介
This is a simple Lua library for packing and unpacking binary data.https://github.com/LuaDist/lpack
可以使用lpack,定义传送数据的格式,如定义数据包头的长度,包体的长度等,然后把定义的包头和包体打包成二进制传送。
lpack的安装
rm -rf lpack
tar xfz lpack.tar.gz
cd lpack
make || exit $?
cp -rf pack.so $WORKDIR/lualib/
lpack的使用
这里需要特别注意,文档中对lpack使用方法介绍是错的。a :打包
require("pack")
bpack=string.pack
bunpack=string.unpack
function pbpack(msgtype, pbmsg)
if not msgtype then
ngx.say("pbpack unknow protobuf msg opcode:%u", msgtype)
return nil
end
-- 使用了protobuf
local msgbuf = protobuf.encode(msgtype, pbmsg)
if msgbuf == nil then
ngx.say("pbpack protobuf faild:%u", msgtype)
return nil
end
-- 协议格式
-- 包头长度6 "<H<HAA" "H为短整型,占2个字节 A为字符串占1一个字节,一共占6个字节",当长度大于1字节需要指定模式
-- 小端
local bodylen = #msgbuf
local pbtypelen = #msgtype
-- "<" 这个是小端模式,不懂可以先行查阅一下小端模式和大端模式
local msg = bpack("<H<HAA", bodylen, pbtypelen, msgtype, msgbuf)
-- 打包之后 #msg 的长度 = 6 + #msgbuf 的长度
return msg
end
b :解包
require("pack")
bpack=string.pack
bunpack=string.unpack
function pbunpack(msgbuf)
-- 获取包体,pbtype的长度
-- 注意返回值得对应关系,第一个返回值不是我们需要的,可以只取一部分
-- 模式必须和打包时的模式一致
local allszie, bodylen, pbtypelen= bunpack(msgbuf, "<H<H")
-- 读取字符串的时候,需要加字符串的长度
local allszie, msglen, bodylen, pbtype, msgbuf= bunpack(msgbuf, "<H<HA" .. pbtypelen .."A" .. bodylen)
local pbmsg, err = protobuf.decode(pbtype, msgbuf)
return pbtype, pbmsg
end
评论暂时关闭