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:排列

Lua5.3 笔记的更多相关文章

  1. LUA5.3的BNF范式学习笔记

     BNF巴科斯范式 {A} 表示 0 或多个 A , [A] 表示一个可选的 A    chunk ::= block block ::= {stat} [retstat] stat ::= ‘;’ ...

  2. Lua学习笔记一

    学习了有一周多了.之前一直不想献丑,但还是记录下这个过程. 第1章  开发软件搭建 1. ubuntu 下lua安装 sudo apt-get install lua5.1 2.win下的环境搭建. ...

  3. OSRM笔记

    OSRM OSRM(OpenStreetMap Routeing Machine)可用于路线规划.作为高性能的路线规划引擎,OSRM使用C++14编写,基于开源的OpenStreetMap数据实现. ...

  4. CentOS6.5环境配置笔记

    CentOS6.5环境配置笔记 一.概述 服务器系统重装,配置应用运行环境 CentOS6.5 x64 二.修改密码 重新设置登录密码 $passwd 或 $passwd root 三.配置端口号及防 ...

  5. MySQL主从同步、读写分离配置步骤、问题解决笔记

    MySQL主从同步.读写分离配置步骤.问题解决笔记 根据要求配置MySQL主从备份.读写分离,结合网上的文档,对搭建的步骤和出现的问题以及解决的过程做了如下笔记:       现在使用的两台服务器已经 ...

  6. LuaForWindows_v5.1.4-45和lua-5.1.4.tar.gz

    Lua学习笔记(一) 安装调试环境 Lua学习笔记(一) 安装调试环境     觉得自己是该掌握一门脚本语言的时候了,虽然曾经用过C# 和JavaScript 写过Unity3D的脚本.但是,总觉得那 ...

  7. [Lua游戏AI开发指南] 笔记零 - 框架搭建

    一.图书详情 <Lua游戏AI开发指南>,原作名: Learning Game AI Programming with Lua. 豆瓣:https://book.douban.com/su ...

  8. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  9. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  10. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

随机推荐

  1. WC2021及学长分享题目

    部分题目见洛谷题单 动态更新. 标 * 为想做的题. hdhd: CF1214G Feeling Good CF1305F Kuroni and the Punishment AGC016F Game ...

  2. .Net Core后端架构实战【3-介入IOC控制反转】

    摘要:基于.NET Core 7.0WebApi后端架构实战[2-介入IOC控制反转]  2023/04/09, ASP.NET Core 7.0, VS2022 引言 Inversion of Co ...

  3. VSCode 中利用 Remote SSH 连接远程服务器

    北京时间 2019 年 5 月 3 日,在 PyCon 2019 大会上,微软发布了 VS Code Remote.这是一个用来实现远程开发的功能插件,对于许多使用 Windows 进行开发,但是需要 ...

  4. List转为Map

    List转为Map 1.业务需求,需要将List<SysSetting>转为Map SysSetting是一个对象 @Data @TableName("t_sys_setting ...

  5. Codeforces Round #877 (Div. 2) A-E

    A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { int n; ...

  6. Unity中的PostProcessScene:深入解析与实用案例

    Unity中的PostProcessScene:深入解析与实用案例 在Unity游戏开发中,我们经常需要对场景进行后处理,以实现更丰富的视觉效果.Unity提供了一个名为PostProcessScen ...

  7. msyql的基本操作(增删改查)

    一.SQL 语法要点 1.SQL 语句不区分大小写,但是数据库表名.列名和值是否区分,依赖于具体的 DBMS 以及配置. 例如:SELECT 与 select .Select 是相同的. 2.多条 S ...

  8. 新版Google浏览器跨域Cookie解决方案

    一.前言 针对Chrome版本67及以上 不能将其他域的Cookie传递过来 注意,这个里面的SameSite不能设为null,设空的话,还是会走默认值Lax 其中,SameSite的值可以填3个:S ...

  9. 反射(Java Reflection)

    Java反射机制概述 Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内部属性及方法. ...

  10. 《最新出炉》系列入门篇-Python+Playwright自动化测试-10-标签页操作(tab)

    1.简介 标签操作其实也是基于浏览器上下文(BrowserContext)进行操作的,而且宏哥在之前的BrowserContext也有提到过,但是有的童鞋或者小伙伴还是不清楚怎么操作,或者思路有点模糊 ...