安装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



相关内容

    暂无相关文章