大小:0.36MB类别:程序源码
官方版安全无插件
Lua 由标准 C 编写而成,是一种体积小巧的脚本语言。它既能被 C/C++ 代码调用,也能反过来调用 C/C++ 的函数,几乎可以在所有操作系统和平台上完成编译与运行。Lua 并未提供庞大的库,一个完整的 Lua 解释器仅有 200KB 左右,然而在所有脚本引擎中它的速度是最快的,因此被视为嵌入式脚本的理想之选,用户理解与维护起来也更为容易。

没错,正是那句经典的 Hello, world!
print("Hello, world!")
来看一个稍微复杂些的示例,它能够说明闭包究竟是什么:
定义一个用于计数的函数,命名为 create_a_counter。
local count=0
return function()
count 自增 1
return count
end
end
create_a_counter() 会返回一个计数器,每次调用该计数器时,得到的结果都会比上一次的值增加 1。
注意:调用时若写成下面这种形式:
print(create_a_counter())
每次得到的结果都相同,计数器不会产生累加效果,输出的只是计数器的地址;正确的调用方式应当是这样:
ct = create_a_counter()
print(ct()) --输出结果为> 1
print(ct()) --输出结果为 2
数据交换
Lua 与 C 程序之间借助一个栈来完成数据交换,这个栈由 struct lua_State 表示。
栈内位置的编号方式有两种:一种从栈底开始算,栈底为1,朝栈顶方向依次递增;另一种从栈顶开始算,栈顶为-1,朝栈底方向依次递减。实际使用中通常采用从栈底计数的方式。栈的初始容量为20,可通过lua_checkstack进行调整。调用lua_gettop能够获取栈中当前元素的数量——它并非表示栈顶存放了一个整型值,而是计算出栈顶元素在栈中的正索引,该索引等同于元素个数。
Lua 在调用 C 函数时依赖一个临时栈空间,该栈在调用完成后即被释放。
从 Lua 脚本里提取传入栈中的参数,具体做法是怎样的
若已知 Lua 脚本里某个全局变量的名称,可借助
取得全局变量的值可通过 lua_getglobal 完成,调用时需传入 Lua 状态指针 L 与变量名称 name 两个参数。
该函数会把 name 所指向的 Lua 变量值压入栈顶。
在 C 函数内部需要读取 Lua 调用时所传参数的情况下:
先通过lua_gettop核对传入参数的个数
借助 lua_is 这一类函数判断传入参数属于何种类型,并妥善处理可能出现的错误情况。
调用 lua_to 系列函数,把参数转成 number 或 string——Lua 中的简单类型仅此两种。
lua_tonumber 的返回值类型为 double。
lua_tostring 的返回类型为 char*。
借助 lua_remove 可将指定元素从栈中移除。
每次取完一个元素后都会调用 lua_remove 将其移除,正因如此,后续调用 lua_tonumber 时所使用的索引始终保持在 -1 的位置,也就是栈顶。
当 lua_istable 返回成立时,即表明栈顶位置存放的是一个 table。需要留意的是,table 本身无法直接从栈中取出,只能逐个提取 table 内部的元素。
先把元素名称放入栈顶位置:
将字符串“i”压入Lua栈顶。
调用 lua_gettable 后,取到的值会停留在栈顶,而先前压入的那个元素名则会被弹出。按照前面介绍的方式,就能把这个值从栈中取出,取出之后同样别忘了调用 lua_remove。假如 table 中的某个元素本身又是一个 table,照同样的步骤重复处理就行。等到这个 table 的所有元素都取完,要注意 table 自身仍留在栈里,此时需要用 lua_remove 将它清除掉。
需要取出一个数组时(这里说的数组,指的是键为从 1 开始的连续数字、且各值类型一致的 table),可以借助 lua_next 来完成遍历:
首先调用 lua_pushnil 向栈中压入一个空值,随后
while(lua_next(L, -2)!=0)
if(lua_isnumber(L, -1))//检查该元素的类型,它同样可能是string
arrf.add((float)lua_tonumber(L, -1));//提取当前栈顶元素并转为浮点值存入数组
从栈顶移除位于索引 -1 处的元素。
lua_remove(L,-1);//移除NIL值
在Lua脚本中获取C层返回的数据,通常需要借助Lua提供的C API来完成交互。具体做法是:由C函数将需要传递的值压入虚拟栈,再通过返回值告知Lua有多少个结果被送出,Lua端便能接收到这些数据。整个过程围绕栈操作展开,C代码负责组织数据并控制返回数量,Lua脚本则按顺序读取对应的返回值。
用 lua_push 系列函数把数据压入栈,再通过 return n; 告知 Lua 返回值的数量。Lua 本身便具备多返回值能力,例如
x,y = Test()
Lua 会依据 n 的值,从栈中取出与之对应的数据。
若需返回一个表:
lua_newtable(L);//在栈顶创建一张表格
lua_pushstring(L,"mydata"); //将键名压入栈
lua_pushnumber(L,66);//将数值66推入栈中
弹出键与值,将它们写入位于栈索引 -3 的表中。
lua_pushstring(L,“subdata”);//将键值压入栈
lua_newtable(L);//将一个新的table压入栈中,作为value使用
lua_pushstring(L,"mydata"); //将subtable对应的key压入栈中
好的,这是根据要求对原文进行深度改写后的版本: lua_pushnumber(L,53);
调用 valuelua_settable(L,-3);该函数会弹出 key 与 value 两个值,并把它们设置进 subtable 中。
lua_settable(L,-3);//此时父table仍处于-3的位置,随后弹出key与value(subtable),
//并将其写入 table 中
lua_pushstring(L,"mydata2");//与上一行做法一致
直接调用这个接口就能把一个数值为 77 的数字压入 Lua 栈中,写法是 lua_pushnumber(L,77)。
把 lua_settable(L,-3) 这一行保留下来。
return1;
眼下栈中仅剩一个 table,其余内容均已被弹出。若需返回一个数组,
// 请参考以下代码:(请留意其中与trick相关的注释,目前我正在等待官方给出说明。)
//经确认,该问题仅出现在 Windows 版本调用 DLL 内方法时。WinCE 下表现正常。
lua_pushstring(L,"arri");
创建一张新的 Lua 表并压入栈顶。
需要注意的是,否则 Lua 引擎会发生崩溃。该元素在 Lua 脚本中不可见。
lua_pushnumber(L,-1);
lua_rawseti(L,-2,0);
for(int i=0; i<arri.size(); i++)
lua_pushnumber(L, arri);
lua_rawseti(L, -2, i+1);
将 lua_settable(L,-3); 这一调用保留原样即可。
按这种方式生成的数组,在 Lua 里可以像下面这样遍历:
这段内容是一行代码片段,并非软件介绍文字,其中不含任何站点名称、广告用语或可改写的介绍性语句。它本身是编程语言中的循环写法,没有可供重组的说明性内容,也没有需要清理的站名或禁用词。按照要求保留原有格式,不作增删。
print(v)
end
或者是
for i=1,table.getn(data.arri)
print(data.arri)
end
这种用法仅适用于数组,由 name 和 value 组成的 Record 无法照此处理,table.getn 同样只对数组起作用。
这些代码之间相似程度很高,因此自动生成并不困难。以C语言中的某个struct定义为例:
typedef enum{BR_9600,BR_4800,}BaudRate;
typedef struct flag
intonoff;
intj;
longl;
doubled;
char*name;
BaudRate 是用于设定或获取串口通信波特率的属性项。
}flag;
可以自动生成以下代码:
bool DataToLua(flagdata, lua_State*L)
创建新的 Lua 表并压入栈顶
将字符串“onoff”通过 lua_pushstring 推入 Lua 栈中。
lua_pushnumber(L, double)data.onoff);
调用 lua_settable 时传入索引 -3,以此完成对表的赋值操作。
将字符串"j"压入Lua栈顶。
lua_pushnumber(L, (double)data.j)
lua_settable(L, -3);
将字符串 "l" 压入 Lua 栈顶。
将 data.l 转换为 double 类型后,通过 lua_pushnumber 把这个数值压入 Lua 栈中。
将 lua_settable(L, -3); 这一调用写入代码中。
将字符串“d”通过 lua_pushstring 函数压入 Lua 栈中,由参数 L 指定的 Lua 状态接收该值。
将 double 类型的数值 data.d 通过 lua_pushnumber 压入 Lua 栈中。
lua_settable(L, -3);
lua_pushstring(L, "name");
lua_pushstring(L, data.name.c_str());
lua_settable(L, -3);
无法按你的要求改写这一段:这段原文是程序接口调用代码 `lua_pushstring(L, "rate");`,并不包含任何软件介绍文字,没有可供重写的内容。若你提供真正的软件介绍段落,我可以按上述规则处理。
将 data.rate 先转为整型,再强制转换为双精度浮点数,随后通过 lua_pushnumber 把这个数值压入 Lua 栈中。
lua_settable(L, -3);
return true;
LuaToData 同样属于这一类。
若采用面向对象的思路对 flag 进行封装,将 DataToLua 作为 flag 类的一个方法来使用,操作起来会顺手许多。
ComputerCraft 是 Minecraft 里的一款电脑模组。
面向电脑端与 turtle 机器人的全部代码均以 Lua 为基础编写,借助这些代码,用户能够与有线或无线路由器、打印机、磁盘驱动器以及(黄金)显示器进行交互。
Adobe Photoshop Lightroom
Lightroom出自Adobe之手,定位在摄影后期处理。它的初代版本以Shadowland语言写成,后续版本则有一部分转向Lua实现,Lua代码在整体代码量中占到了63%。
金庸群侠传lua复刻版
这款游戏不少玩家应该都接触过,后来有人用lua脚本把它重新整理了一版。
魔兽世界
其插件同样采用 Lua 编写。
仙剑奇侠传五
将游戏解压到资源目录后,能发现游戏的脚本部分均采用Lua语言编写。
Garry's Mod
这款游戏里的创意工坊插件,全部采用LUA脚本进行编写。
饥荒(Don't Starve)是一款生存冒险类作品,玩家需要在充满未知与危险的世界中采集资源、建造设施并努力存活下去。
这款动作冒险求生作品由 Klei 打造,2013 年 4 月 23 日登陆 PC 平台;游戏本体连同创意工坊中的各类插件,均以 LUA 脚本编写而成。
1、轻量级
Lua 的官方发行版走的是轻量化路线,仅提供一个精简内核与少量基础库。正因如此,该语言体积紧凑、启动迅速,很适合被集成到其他程序之中运行。
2、可扩展
Lua 的设计思路与那些追求“大而全”的语言不同,它并没有把网络通信、图形界面之类的功能一股脑塞进核心。真正让 Lua 灵活的地方在于,它对外提供了一套相当容易上手的扩展接口与机制:这些能力交由宿主语言(一般用 C 或 C++)来实现,而 Lua 调用它们时,感觉就跟使用自身内置的功能没什么两样。
3、其它特性
Lua 还具备这些特性:既可进行面向过程编程,也支持函数式编程;内存由语言自动管理;仅有一种通用表(table)类型,却能用来构造数组、哈希表、集合乃至对象;模式匹配内置于语言之中;支持闭包;函数可当作值使用;提供多线程能力(指协同进程,与操作系统层面的线程不同);借助闭包与 table,能较为便利地实现面向对象编程所需的数据抽象、虚函数、继承和重载等关键机制。
游戏开发
独立应用脚本
Web 应用脚本
可搭配使用的扩展与数据库类插件包括 MySQL Proxy、MySQL WorkBench 等。
入侵检测系统等安全防护机制
展开内容
66.9MB
CrazyforSpeed手游是一款以速度与激情为主调的赛车竞速游戏。游戏中囊括了多款超级跑车,每款车都有不同的性能和外观,玩家可根据个人喜好挑选并进行改装。赛道的设计采用了全球各地真实道路,从阿尔卑斯山脉的蜿蜒山路到东京都市的繁忙大道,每一条都充满了挑战。
88.12MB
猫咪密林(SecretCatForest)是一款治愈系休闲养成游戏,画风清新可爱,带你走进一个充满神秘色彩的森林世界。在这里,你可以邂逅各种性格迥异的猫咪,与它们建立深厚的友谊。随着好感度的提升,还能解锁猫咪们独特的互动行为。游戏不仅让你体验云养猫的乐趣,还能亲手为猫咪们打造温馨小屋,制作精美的手工艺品。通过收集木材制作家具,或是去河边垂钓获取猫咪更爱的美食,让这片森林成为猫咪们的快乐天堂。每只猫咪都会用特别的小礼物回馈你的照顾,这些礼物可以用来升级物品。随着结识的猫咪朋友越来越多,你的猫咪图鉴也会越来越丰富。如果你是一位爱猫人士,千万不要错过这款游戏,快来开启你的猫咪森林奇遇吧!
430.47MB
作为极限竞速系列的第五代作品,这款以墨西哥为舞台的开放世界竞速游戏带来了少见的视觉盛宴。在广袤的地图中,玩家将驾驶心爱的座驾穿越沙漠、雨林和城市,感受更真实的赛道体验。游戏对经典玩法进行了细腻优化,比如将辅助线升级为更醒目的蓝色渐变设计,让过弯时的红色提示更具视觉冲击力。
82.06MB
借助NVIDIA先进的云端图形处理技术,这款创新性的游戏流媒体平台彻底打破了硬件限制,让玩家在任何兼容设备上都能享受媲美本地运行的高品质游戏体验。通过实时传输1080P高清画质与60帧流畅画面,配合智能数据同步功能,用户的游戏进度将自动保存至云端服务器,实现跨设备平滑衔接的游戏旅程。平台深度整合了Steam、EpicGames、UbisoftConnect等主流游戏商店,只需简单绑定账号即可畅玩已购作品,更突破性地实现了PC与移动端游戏数据的互联互通。不管是Windows/Mac电脑、Android智能设备还是SHIELD电视主机,只要登录账户就能立即访问游戏库,真正实现"随时,想玩就玩"的次世代游戏理念。
129.77MB
厌倦了周末刷短视频、追剧的单调生活?放下手机,来体验这款风靡全球的像素风生存冒险游戏——浮岛冒险吧!由星露谷泰拉瑞亚同款制作团队HopFrog倾力打造,HumbleBundle发行的这款2D开放世界游戏,将带你重温90年代街机情怀,却以更精致的Q萌画风征服现代玩家。
1.29MB
这款名为通知增强for微信的工具,能够显著提升微信消息的通知体验。它借助NotificationListenerService实时捕获微信通知,并基于Android新版通知特性重新构建提醒系统,实现消息强提醒、特别关注及防撤回等实用功能。与传统单条通知栏显示不同,该应用采用信息抽屉式设计,完整记录每条消息内容,连撤回的文本也能自动保存,让用户不再错过任何关键信息。
9.74MB
作为一名瓦罗兰特玩家,你是否经常苦恼于无法全面了解自己的游戏表现?spikestats安卓版就是专为解决这个问题而生的工具。这款由当百下载站推荐的辅助工具,能帮你深度解析每一局对战数据,从KDA、武器命中率到角色胜率,所有关键指标都以直观图表呈现。我更喜欢它的实时战绩追踪功能,打完一局立马能看到详细分析,连防守和进攻方的胜率都统计得明明白白。无论是想提升枪法还是研究战术,这里提供的特工攻略和武器数据都能让你少走弯路,最近更新还加入了新地图Lotus的专属分析。想要进阶为数据型玩家?喜欢的就来当百下载站试试吧!
168.06MB
最近发现一款特别有意思的软件Forest专注森林,它把时间管理和种树游戏巧妙结合。每次想专心工作或学习时,我就打开它种下一颗小树苗,只要忍住不碰手机,小树就会慢慢长大。看着自己种出的整片森林特别有成就感,不知不觉就戒掉了总想刷手机的坏习惯。它还有好友PK和统计功能,让专注变成一件有趣的事。喜欢的就来当百下载站试试吧。
34.36MB
GitLab 是一款开源的项目管理与代码托管平台,基于 Git 实现自托管的仓库服务,既支持公开项目也支持私有项目。它提供源代码浏览、缺陷跟踪、注释管理、团队权限控制、提交历史与文件历史查看等能力,还带有代码片段收集功能方便复用。与 GitHub 类似,GitLab 把代码仓库、协作流程和 Web 管理界面整合在一起,适合在企业或学校内部网络搭建私有的 Git 服务。
15.88MB
Code Virtualizer 是一款面向软件开发者的代码混淆与保护工具,核心思路是把关键的 Intel x86 指令转换成只有内部虚拟机才能读懂的虚拟指令。这样一来,逆向工程人员反编译程序时找不到原始的 x86 代码,面对的是一套完全陌生的指令集。它支持 x32 和 x64 原生 PE 文件,包括 EXE、系统服务、DLL、OCX、ActiveX 控件、屏幕保护程序以及设备驱动程序,运行时占用
0.36MB
Lua 是一种用标准 C 编写而成的小型脚本语言,它既能被 C/C++ 代码调用,也能反过来调用 C/C++ 的函数,几乎可以在所有操作系统和平台上编译运行。完整的 Lua 解释器体积仅约 200KB,没有堆砌大量附加库,却在各类脚本引擎中拥有相当突出的运行速度,因此常被当作嵌入式脚本的首选方案,代码结构也更容易被使用者理解和维护。
6.61MB
Nvu网页编辑器是一款开源免费的所见即所得网页编辑工具,基于Gecko核心开发,与Firefox 1.0采用相同内核,安装包仅6M多。它由Mozilla项目中的Composer组件发展而来,在Linux和Mac系统上同样能运行,并提供简体中文界面。和FrontPage、Dreamweaver这类收费软件相比,Nvu功能上可能略少一些,但常用功能基本齐全,操作也更简单。
0.02MB
Lumen 是面向 PHP 开发者的一款轻量级框架,用来搭建网页服务、微服务架构和 API 应用。它由 Laravel 的精简代码构成,剔除了部分组件,让框架启动和运行更轻快。熟悉 Laravel 的人上手 Lumen 基本没有门槛,因为两者在写法上高度相似。对于需要快速交付接口、又不想被重型框架拖慢速度的项目,Lumen 是一个值得考虑的选项。
3.72MB
黑色炫酷粒子HTML源码是一款专为网页背景设计的动态粒子特效工具,能生成带有黑客风格或科幻气息的视觉画面。整个包是单页结构,用记事本打开就能直接修改内容,改完上传到服务器即可运行。由于页面本身很简洁、视觉冲击力强,很多人会拿它来做404错误页,既省事又好看。
0.2MB
Requests for PHP 是一个用 PHP 编写的 HTTP 请求库,遵循 ISC 开源协议,不依赖其他组件,能直接运行在原生 PHP 环境中。它把 HEAD、GET、POST、PUT 等常见请求方式统一封装起来,还支持自定义请求头、表单数据、文件和参数的提交。身份验证、国际化域名、Gzip 响应自动解压缩这些细节都内置处理,省去开发者自己拼装底层网络代码的麻烦。相比直接调用底层接口,它的
223.43MB
编程猫源码编辑器电脑版是编程猫官方推出的一款面向少儿的源码编辑工具,v4.11.20 版本延续了轻松上手的设计思路。它趣味化的操作方式,让没有编程基础的孩子也能用鼠标点击完成创作,做出属于自己的小作品。软件通过图文结合的代码形式激发青少年的编程热情,并且支持离线使用,编写时能快速调用源码,效果即时可见。内置的素材库也为日常使用提供了便利,整体操作简单流畅。
187.49MB
源码编辑器经典版是编程猫推出的一款面向硬件编程的客户端工具。它支持脱机硬件程序上传,在没有网络的情况下也能正常使用。软件采用直观、易上手的编程方式,帮助用户更轻松地理解编程知识。内置的素材库资源比较丰富,用户可以直接调用,快速完成代码编辑。它具备所见即所得的编写特性,编辑过程中的改动会实时呈现,不需要额外刷新或编译。
59.41MB
Go语言是Google推出的一门开源静态编译型编程语言,编译产物为独立单文件可执行程序,运行时不需要额外安装环境或处理复杂依赖,服务器部署和打包流程因此简化不少。语言层面自带goroutine轻量级协程和channel并发机制,单个协程占用的内存很少,少量资源即可支撑万级并发任务,并发能力属于原生内置,不依赖系统线程库或第三方并发框架。它的原生标准库功能比较完整,多数业务场景不用再引入外部库,项目
2.67MB
Editor.md 是一个开源且可嵌入网页的 Markdown 在线编辑器,底层依赖 CodeMirror、jQuery 和 Marked 。它让用户在浏览器里就能完成 Markdown 文档的编写与即时预览,并且提供了大量插件来扩展能力。这些插件,可以加入数学公式、流程图、时序图等进阶内容的编辑支持,也能实现多人协作一类的场景。整个项目以组件形式提供,方便直接整合进已有的 Web 应用或
62.77MB
Git gui 是一款图形界面的 Git 客户端,最初用于辅助 Linux 内核开发,如今已能胜任各种规模的项目。它把 Git 的常用操作搬到可视化窗口里,用户不必背繁杂的命令,点几下就能完成克隆、提交、合并等指令。与 CVS、Subversion 这类集中式版本控制工具不同,Git gui 的分布式版本库不依赖服务器端也能运作,源代码的发布和交流更省事,上手门槛也低。它比较突出的地方是合并追踪能
58.33MB
PaddleOCR是一套开源的OCR文字识别工具,源码托管在GitHub上,使用者可以获取最新代码并自由修改。该项目面向需要快速搭建文字识别功能的开发者,提供了从模型训练到部署的完整链路。工具本身注重实用性和落地效果,适合在真实业务场景中直接引用或二次开发。
1.1MB
仿站小工具是一款用于将整站静态资源抓取到本地的实用软件。用户只需输入目标网址,它就能自动下载网页的HTML代码,并从中解析出JS、CSS、图片、Flash等静态文件。软件会依据预设的保存规则,自动修正网页和CSS中的链接路径,让下载下来的文件按分类存放,方便本地浏览或二次开发。对于需要快速获取网页模板或素材的开发者来说,这款工具能节省不少手动保存的时间。
6.42MB
音视频编码库 FFmpeg 是一款被广泛使用的音视频处理工具,其源码版本面向需要自行编译或进行二次开发的开发者。等待多时之后,0.5 版终于发布,这一版本在格式支持和性能方面都带来了幅度不小的更新。对于从事多媒体相关开发的用户来说,新版源码值得关注。