基于lua-cmsgpack修改,增加了一些增强特性。
可以集成在项目内,也可以生成动态库。
sh build.sh
require("msgpack")
local pkt = msgpack.newPacket()
pkt:packs(1,2,3,"hello",{"a","b","c"})
print(pkt:unpacks()) --解包所有的元素
pkt:reread() --重读pkt
local item1,item2 = pkt:unpacks(2) --解包前2两个元素,输出:1,2
-- unpacks() 不传参数表示解包所有元素,传一个数字参数,表示解包指定个数的元素
wrap(1,2,3) 等价于 pkt:packs({1,2,3}),即是一种打包数组的变种,wrap的方式不需要构建一个table,可以减少一些table。
local pkt = msgpack.newPacket()
pkt:wrap(1,2,3)
local item1,item2,item3 = pkt:unwrap()
print(item1,item2,item3)
可以用来pack一个子包(也是一个msgpack对象),底层是用bytes来存储数据。
local pkt1 = msgpack.newPacket()
pkt1:packs(1,2,3,"haha")
local pkt = msgpack.newPacket()
pkt:packs("hello",1000) --可以pack基础类型的元素
pkt:packPacket(pkt1) --如果第二个参数为1,表示是追加模式,某些时候比较有用,追加模式下,子包不是以字符串的方式传递
local item1,item2 = pkt:unpacks(2) --取出前两个基础类型元素
local subPkt = msgpack.newPacket()
pkt:unpackPacket(subPkt) --取出子包
print(subPkt:unpacks()) --解子包
用来增强wrap,一个wrap_pre表示pkt要开始打包一个数组格式的元素,wrap_end 表示结束数组打包,unwrap_header则表示解包数组的长度。
-- 假如需要打包下面的数据:
-- t = {1,2,3,{{"a","b"},{100,200}},"hello","domi"}
local pkt = msgpack.newPacket()
pkt:wrap_pre()
pkt:packs(1,2,3)
pkt:wrap_pre()
pkt:wrap("a","b")
pkt:wrap(100,200)
pkt:wrap_end()
pkt:packs("hello")
pkt:packs("domi")
pkt:wrap_end()
local n = pkt:unwrap_header()
print(n) --n=6
local item1,item2,items = pkt:unpacks(3) --输出:1,2,3
print(item1,item2,items)
local sn = pkt:unwrap_header()
for j=1,sn do
print(pkt:unwrap())
end
local hello,domi = pkt:unpacks(2)
print(hello,domi)