lua 二进制打包库lpack

jce序列化到lua的项目遇到一个难点,jce是类c++的,支持void,bool,byte,short,int,long,float,double,string等类型,而lua是动态类型语言,基本类型也只有number,string,function,table,usrdata....,怎么让jce中的类型正确的用Lua表示。

参考python的实现,python用的是struct库中的struct.pack()和struct.unpack()以及struct.unpack_from()方法。于是github找发现lua也有类似的库----lpack 下载链接:https://github.com/LuaDist/lpack,使用方法同bit库,用动态链接的方法。
具体调用方法,提供了两个接口: pack和unpack,但是有两种调用方法,使用宏(USE_GLOBALS)来控制,第一种是使用全局接口(pack/unpack),另外一种是将这两个接口插入到string的空间里面(string.pack/string.unpack)pack操作用于将lua变量按自定义类型打包成string类型,unpack用于解包,接口参数入下

pack (f, ...)
Packs values into string 
Parameters:
f:string Format string.
... Values to pack.
Returns:
string Packed string.
 
unpack (s, f[, init])
Unpacks values from a string
Parameters:
s :string Packed string.
f :string Format string.
init int Initial position.
Returns:
int Next unread position.
Value(s) from string.


使用例子

require("pack")
local pack=string.pack---将接口插入到string空间中
local unpack=string.unpack
 
str=pack(">I>I>I",100,200,300) ---I表示按int类型即4个字节打包,>表示字节序
print(#str,type(str))    ---输出12 string,3个int等于12字节,打包生成string类型
print(str)               ---但是这样不能输出,没查到原因
 
print(unpack(str,">I"))  ---输出 5 100 ,5表示下一个未读字节的位置,100是因为默认从位置0开始读,">I"表示只读取一个
print(unpack(str,">I>I",5))---输出13 200 300,从位置5开始读两个,下一个未读位置是13


打包变量类型定义

#define OP_ZSTRING  'z'     //空字符串
#define OP_BSTRING  'p'     //长度小于2^8的字符串
#define OP_WSTRING  'P'     //长度小于2^16的字符串
#define OP_SSTRING  'a'     //长度小于2^32/64的字符串*/
#define OP_STRING   'A'     //指定长度字符串
#define OP_FLOAT    'f'     /* float */
#define OP_DOUBLE   'd'     /* double */
#define OP_NUMBER   'n'     /* Lua number */
#define OP_CHAR     'c'     /* char */
#define OP_BYTE     'b'     /* byte = unsigned char */
#define OP_SHORT    'h'     /* short */
#define OP_USHORT   'H'     /* unsigned short */
#define OP_INT      'i'     /* int */
#define OP_UINT     'I'     /* unsigned int */
#define OP_LONG     'l'     /* long */
#define OP_ULONG    'L'     /* unsigned long */


打包字节序

#define OP_LITTLEENDIAN '<'     /* little endian */
#define OP_BIGENDIAN    '>'     /* big endian */
#define OP_NATIVE       '='     /* native endian */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值