1. 程式人生 > >lua 二進位制打包庫lpack

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 */