pack ==== 作者:吴永 更新时间:2020年8月14日 关键字:PWM、脉冲输出 .. _pack-1: pack ---- pack 库支持将一系列数据按照格式字符转化为 lua 字符串或者将 lua 字符串按照格式字符转化成 一系列值 格式字符串格式如下: [endianness]< format specifier >[count] endianness:字节序 - ‘<’ 小字节序,最低有效字节优先,更低的字节有效位占据着更低地址的内存空间。 - ‘>’ 大字节序,最高有效字节优先,更高的字节有效位占据着更低地址的内存空间。 - ‘=’ 自然字节序,默认。 format specifier:参照下面格式化符号 count:取字节个数 ========== ========================================== 格式化符号 变量类型 ========== ========================================== ‘z’ 以’\0’结尾的字符串 ‘p’ 在string数据前面加一个字节的string长度数据 ‘P’ 在string数据前面加2个字节的string长度数据 ‘a’ 在string数据前面加4个字节的string长度数据 ‘A’ 字符串(string) ‘f’ 浮点数(float) ‘d’ 双精度浮点数(double) ‘n’ Lua数字(Lua number) ‘c’ 字符(char) ‘b’ 字节(byte = unsigned char) ‘h’ 短整型(short,两字节) ‘H’ 无符号短整型(unsigned short,两字节) ‘i’ 整型(int,四字节) ‘I’ 无符号整型(unsigned int,四字节) ‘l’ 长整型(long,八字节) ‘L’ 无符号长整型(unsigned long,八字节) ========== ========================================== -------------- pack.pack() ~~~~~~~~~~~ 打包字符串的值,在pack的时候有符号 无符号的输出结果都是一样的 unpack时有符号跟无符号才有区别 - 语法 ``packed = pack.pack( format, val1, val2, ..., valn )`` - 参数 ====== ================ 参数 释义 ====== ================ format 格式化符号 val1 第一个需打包的值 val2 第二个需打包的值 valn 第n个需打包的值 ====== ================ - 返回值 一个包含所有格式化变量的字符串 - 例子 .. code:: lua print("pcak.pack test:") print(pack.pack("A",10))--当"10"以字符串形式包装时,会打印出“10” print(common.binstohexs(pack.pack("b",0x10)))--将0x01以十六进制打包为字符串,然后用十六进制输出0x10 print(pack.pack("A","LUAT")) -------------- pack.unpack() ~~~~~~~~~~~~~ 解包字符串 - 语法 ``nextpos, val1, val2, ..., valn = pack.unpack( string, format,[ init ] )`` - 参数 ============ ============================= 参数 释义 ============ ============================= string 需解包的字符串 format 格式化符号 init(可选) 默认值为1,标记解包开始的位置 ============ ============================= - 返回值 ======== ================== nextpos 字符串标记的位置 ======== ================== **val1** **第一个解包的值** **val2** **第二个解包的值** **valn** **第n个解包的值** ======== ================== - 例子 .. code:: lua print("pack.unpack test:") nextpox1,val1,val2,val3,val4=pack.unpack("luat100","c4")--"nextpos"下个待解析的位置 ,取4个字符(char) print(nextpox1,val1,val2,val3,val4) --分别对应的是"5",l","u","a","t"的ascii码数据 print(string.char(val1,val2,val3,val4)) --将ascii码数据转化为字符输出 nextpox2,string1=pack.unpack("luat100","A4")--输出“luat” print(nextpox2,string1)--输出5 luat nextpox3,number1,number2=pack.unpack(common.hexstobins("006400000064"),">H>i")--[[输出无符号短型和整形,因为无符号短型是2个字节,整形是4个字节,输出为100,100--]] print(nextpox3,number1,number2)--输出7 100 100 nextpox3,number1=pack.unpack(common.hexstobins("0064"),">h")--输出为100,因为短型是2个字节 print(nextpox3,number1)--输出3 100 --------------