• Lua5.3 笔记


    Lua5.3 笔记

    最近用skynet,sproto通讯,完全看不懂通讯二进制是怎么写的,发现都是string这个,string那个,完全理解不来。
    于是查了一下string.pack的api,和之前别的语言里面用的writeByte,writeShort,writeUnsignedInt这样的写法完全是不一样的。
    然后在此记录下来。

    参考

    字符串的Pack和Unpack

    API

    string.pack, string.unpack, string.packsize的接收的第一个参数的一个格式化的字符串,这个字符串决定了接下来创建的字符串结构的读或者写的方式。
    格式化字符串是一个约定序列,可用约定选项如下:

    • <: 使用little endian
    • >: 使用big endian
    • =: 使用本地默认endian
    • ![n]: 设置最大alignment为 n (默认本地 alignment)
    • b: 一个带符号字节 (char)
    • *B: 一个无符号字节 (char)
    • h: 一个带符号短整(本地尺寸)
    • H: 一个无符号短整(本地尺寸)
    • l: 带符号长整型 (本地尺寸)
    • L: 无符号长整型 (本地尺寸)
    • j: 一个lua_Integer
    • J: 一个lua_Unsigned
    • T: 一个size_t (native size)
    • i[n]: n个字节的带符号int (默认本地尺寸)
    • I[n]: n个字节的无符号int (默认本地尺寸)
    • f: 浮点型 (本地尺寸)
    • d: double型 (本地尺寸)
    • n: 一个lua_Number
    • cn: 一个固定n个字节长度的字符串
    • z: 一个 zero-terminated 字符串
    • s[n]: 一个字符串,先将长度以无符号整型写入,后面是n个byte (默认是一个 size_t)
    • x: 一个字节的 padding
    • Xop: 一个根据他的选项操作排列的空白item (反之忽略 ignored)
    • ' ': (空格) 忽略

    除了padding,空格和configuration("xX <=>!")之外,每个选项都对应一个参数(string.pack)或者一个结果(string.unpack
    对于 !n , sn , in 以及 In ,_n_可以说1-16之间的任何整数。All integral options check overflows(所有整型都会检查溢出); string.pack 会检查提供的值是否适合提供的尺寸;string.unpack 会检查读取的值是否是一个 Lua Integer。【暂时不懂后半句】
    如果字符串以 "!1=" 为前缀,with maximum alignment of 1 (no alignment) and native endianness. (以本地编码的1的最大排列)
    排列的过程:对于每个选项,如果数据长度不够的话,都会以padding补齐。For each option, the format gets extra padding until the data starts at an offset that is a multiple of the minimum between the option size and the maximum alignment; this minimum must be a power of 2. "c" 和 "z" 不排列; "s" 遵循它开始的整型排列.

    所有的 padding 在 string.pack时都是以0填充 (在 string.unpack 中忽略)

    Demo

    local str = string.pack(">i2",10)
    print(str)
    
    local str = string.unpack(">i2",str)
    print(str)
    

    output:

    a
    
    10
    
    

    UTF8

    居然有6.5 – UTF-8 Support

    名词

    • alignment:排列
  • 相关阅读:
    WinForm窗体传值 总结
    SQLServer遍历数据库所有表及统计表数据总数
    GridView合并行代码
    日期转换成字符串
    flex与js交互浅析
    九,query task
    八,graphics
    十,Find and Identity
    转移批令
    db dw dd 和 dup
  • 原文地址:https://www.cnblogs.com/adoontheway/p/8692234.html
Copyright © 2020-2023  润新知