lua 二進位制打包庫lpack
阿新 • • 發佈:2019-01-24
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
- 具體呼叫方法,提供了兩個介面: 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 */