Lua table、模块与面向对象
很久之前接触过lua,最近在工作中又用到了一些,对lua这门语言又有了新的认识和理解。Lua是一门很简洁高效的语言,在openresty项目中大量使用,游戏开发中也使用lua来写一些脚本。在这里记录一下自己对lua中面向对象的理解。
table在lua中是一种kv的数据结构,也指由一些辅助函数组成的库。如:
local tb = {name="zhangsan", age=23} --此时变量tb为是一个table的数据结构
table.getn(tb) --此时便是调用了table库里的getn函数,获取tb的长度。
在lua中table数组的下标索引通常从1开始计数,因为这表示的是位置,而在c/c++中数组从0开始,表示的是偏移量。在初始化一个table数组时,若不显示的使用键值对赋值,则默认会用数字作为下标,从1开始。栗子:
local person = {name="zhangsan", 23, phone=138138138, addr="beijing"}
print(person[ ...
Wireshark+Lua自动解析自定义协议数据报
自定义协议格式
原始抓包结果
编写Lua脚本
在Wireshark中加载Lua脚本
在Wireshark中查看解析结果
参考文献
在平时的工作中,经常需要根据接口文档进行开发,在调试时一般都会借助WireShark抓包进行分析,但是当协议较为复杂时,需要根据字节数手动计算进行解析,费时费力。曾经打算自己写个简单的自定义协议解析工具,后来发现WireShark提供了Lua接口,可以通过Lua脚本根据协议格式自动对获取的数据报进行解析,本文将对此进行简要介绍。
自定义协议格式
#pragma pack(1)
struct MsgHead {
int msgNo_;
unsigned char msgType_;
unsigned char subMsgType_;
short dataLen_;
};
struct MsgStruct {
MsgHead msgHead_;
unsigned char data_[MaxDataSize];
};
#pragma pack()
原始抓包结 ...
Valuable Web
这篇文章整理一下曾经在Google Reader上订阅的有价值的Blog。这些Blog都曾经或多或少的改变了我对待工作和生活的态度,谢谢这些作者。
##Google Reader中的好网站
这些网站曾经在黑暗中为我点亮一盏盏指路的灯,希望你也能从中受益。
Mind Hacks 刘未鹏的Blog,每一篇文章都很有营养,值得细读。不过貌似最近两年更新频率不高了。
… TODO
tolua实现分析
tolua++如何将c++对象导入到lua里tolua++为每一个传入lua的对象建立一个userdata,userdata的值,是c++对象的地址。userdata的metatable,是一个tolua++建立的,记录了userdata对应c++类型信息的表格,包括导出的成员变量、成员函数等信息。
对于成员变量的读取赋值,tolua++是在metatable里新建了.get和.set两个表。两个表里分别存储了以变量名为键,以读取设置c函数为值的表项。在metatable的index和newindex里,以变量名为键,从.get和.set表里取得读取设置函数并调用。
对于成员函数的调用,只需要以函数名为键,函数为值,存储在metatable里就好了。
传入c++对象的tolua++函数是tolua_pushusertype。一般情况下,第一次使用这个函数将一个c++对象push到lua堆栈上时,才会新建userdata。tolua++会以c++对象地址为键,userdata为值,将键值对存储在tolua_ubox表里。下次推入同样的c++对象时,从这个表里取出userdata推入堆栈即 ...
Lua数据结构的实现
《Lua程序设计》笔记:高效地使用table来实现一些传统的数据结构
1 数组Lua库和长度操作符都遵循索引从1开始的约定。
2 多维数组123456789101112131415mt = {}for i=1, N do mt[i] = {} for j=1, M do mt[i][j] = 0 endend--合并索引(i*常量 + j)mt = {}for i=1, N do for j=1, M do mt[(i-1)*M+j] = 0 endend
3 链表、队列table是动态实体,所以实现链表很方便;实现队列的话,使用table库的insert、remove。1234567891011121314151617181920212223242526272829303132--主要是new/pushlast/popfirstList = {}function () return {first=0, last=-1}endfunction List.pushfirst(list, value) local f ...
EmmyLua 学习使用
目录
lua元表
class的探索
一直都在使用Idea加上EmmyLua进行开发,但是当初别人为什么这样选择和选择的优点在哪里自己一概不知,直到前段时间翻到EmmyLua带有注解功能,才明白使用的好处。
lua元表
基本类型
nil
boolean
number
string
function
userdata
thread
table
要想对lua有更加深入的了解,不深入的了解lua的元表是不行的,在lua中元表是你构建一个复杂的数据结构的基础,所以需要对元表有非常深入的了解。
元表允许改变table的行为,每个行为关联对应的原方法。
在这里有两个关于元表非常重要的方法:
setmetatable(table,metatable)
getmetatable(table)
元表(metatable)中存在 __metatable 键值,则会设置和返回失败
__metatable键值是用于安全考虑,可以防止获取和修改元表中的内容。
元方法是关联两个元表的桥梁,是非常重要的,下面介绍几个重要的元方法。
元方法
元方法一共 ...
Lua学习笔记
<p>关于Lua的<a href="http://www.lua.org/about.html" target="_blank" rel="external noopener noreferrer">官方定义</a>:</p>
别的我就不多安利了
type
table
table是类似class的hash_map,由data和method两部分组成。简而言之,数据和行为是分离的,后者在Lua中称为metatable。metatable有很多特有的键,在此我们粗暴的认为特有键类似c++中的操作符,它们的值一般为function或table。
setmetatable
我们可以通过setmetatable来赋予table不同的动作。
1234
t = {} mt = {} setmetatable(t, mt) -- 设定mt为t的metatablegetmetatable(t) -- 返回mt
以上代码可以缩略为:
...
【leetcode】 399 Evaluate Division
给出一些等式,求给定表达式的结果
描述方程式以A/B=k格式给出,其中A和B是用字符串表示的变量,k是实数(浮点数)。给定一些查询,返回答案。如果答案不存在,返回-1。
比如给定: A / B = 2.0,B / C = 3.0。要求: A / C = ? B / A = ? A / E = ?A / A = ?,X / X = ? …
样例12输入: [ ["a", "b"], ["b", "c"] ],[2.0, 3.0],[ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ]输出: [6.0, 0.5, -1.0, 1.0, -1.0 ]
思路初期想直接按照实体数字,比如将 a 设定成 1 ,就可以求出 b , 递推求出其他的字母,后来发现这样做之后遇到之前两个字母都没有记录的数字会很麻 ...
centos下安装openresty+ngx_lua_waf防火墙部署
全文默认安装路径:/usr/local/src
1、安装Luagit:1234567# cd /usr/local/src# wget http://luajit.org/download/LuaJIT-2.1.0-beta3.tar.gz# tar -zxvf LuaJIT-2.1.0-beta3.tar.gz# cd LuaJIT-2.1.0-beta3# make# make install#ln -sf luajit-2.1.0-beta3 /usr/local/bin/luajit
2、安装openresty:12345678# cd /usr/local/src# wget http://openresty.org/download/ngx_openresty-1.13.6.2.tar.gz# wget https://sourceforge.net/projects/pcre/files/pcre/8.42/pcre-8.42.tar.gz# tar -zvxf pcre-8.42.tar.gz# tar -zvxf ngx_openresty-1.13.6.2.tar. ...
Lua初体验
背景
项目中后期需要支持热更新,因此只能把之前基于UGUI的C#外围逻辑全部修改为Lua,修改过程中的方案是做一个兼容处理,新逻辑用Lua,并在项目推进过程中逐步把外围都改为Lua编码。
项目中的接入实践
工程目录结构
XFramework/lua -- C#端脚本根目录
------------------------------------------------------
luaScripts -- Lua端脚本根目录
├── api -- 用于写代码时只能提示Api信息
├── cfg_sheet -- 本地配置表对应的代码
├── common -- 核心常用代码
├── libs -- 第三方库 例如 protobuf,cjson...
├── proto -- 协议对应代码
├── service -- 数据层服务代码
├── ui - ...