在Lua编程语言中,函数(function)和表(table)、线程(thread)等一样,都是变量[1]。而函数,本质上就是一个程序,所以是可以以二进制码的形式表达的。本文介绍如何在Lua中把函数以二进制码进行保存,如何查看保存的二进制码,如何将保存的二进制码重新转换成函数,以及该功能的用处。
一、保存
在Lua中,要把函数保存为二进制码,应当使用string.dump(function)函数。详见博文[2]的说明。这里以一个简单的函数为例:
function F1()print("This is function F1")
end
func_content = string.dump(F1)
print("type of func_content is", type(func_content))
--string
在上述代码中,func_content的类型是字符串(string)。
二、查看
接下来,要在Lua中把func_content,即函数的二进制内容显示出来。先尝试用普通的字符串显示函数print
print(func_content)
--LuaT
也就是说,打印出来的内容就是LuaT,似乎没有意义,原因出在哪里呢?
Stack OverFlow上的[3]指出,LuaT就是指string.dump产生的字节码(在Lua 5.4是LuaT,在Lua 5.2是LuaR)。这样的字节码无法用常规的print方式显示,但[4]中给出了一种显示字节码的方式。这里使用该方式。
buff = ""
for v=1,string.len(func_content) dobuff = buff .. '\\' .. string.byte(func_content, v)end
print(buff)
在以上代码中,string.byte(func_content, v)返回func_content的第v个字节的十进制整数。string.byte的具体使用方式说明,请参考[5]。
打印出来的内容是
\27\76\117\97\84\0\25\147\13\10\26\10\4\8\8\120\86\0\0\0\0\0\0\0\0\0\0\0\40\119\64\1\24\238\45\45\72\101\114\101\32\108\101\116\39\115\32\108\101\97\114\110\32\97\98\111\117\116\32\102\117\110\99\116\105\111\110\10\112\114\105\110\116\40\34\108\101\97\114\110\32\102\117\110\99\116\105\111\110\115\32\105\110\32\76\117\97\34\41\10\10\102\117\110\99\116\105\111\110\32\70\49\40\41\10\32\32\32\32\112\114\105\110\116\40\34\84\104\105\115\32\105\115\32\102\117\110\99\116\105\111\110\32\70\49\34\41\10\101\110\100\10\10\70\50\32\61\32\102\117\110\99\116\105\111\110\40\41\10\32\32\32\32\112\114\105\110\116\40\34\84\104\105\115\32\105\115\32\102\117\110\99\116\105\111\110\32\70\50\34\41\10\101\110\100\10\10\70\49\68\32\61\32\70\49\10\10\70\49\40\41\10\70\50\40\41\10\112\114\105\110\116\40\34\110\111\119\32\70\49\68\34\41\10\70\49\68\40\41\10\10\45\45\70\49\68\32\98\101\104\97\118\101\115\32\115\97\109\101\32\97\115\32\70\49\44\32\115\111\32\102\117\110\99\116\105\111\110\32\105\115\32\97\108\115\111\32\97\32\118\97\114\105\97\98\108\101\44\32\108\105\107\101\32\97\32\99\108\111\115\117\114\101\32\105\110\32\83\119\105\102\116\10\10\45\45\32\78\111\119\32\116\97\107\101\32\97\32\108\111\111\107\32\97\116\32\116\104\101\32\105\110\112\117\116\32\97\110\100\32\111\117\116\112\117\116\32\111\102\32\97\32\102\117\110\99\116\105\111\110\10\10\102\117\110\99\116\105\111\110\32\103\101\116\69\97\99\104\86\97\114\105\97\98\108\101\80\108\117\115\49\40\118\49\44\32\118\50\44\32\118\51\44\32\118\52\41\32\45\45\97\32\102\117\110\99\116\105\111\110\32\99\97\110\32\104\97\118\101\32\109\117\108\116\105\112\108\101\32\105\110\112\117\116\115\32\97\110\100\32\97\108\115\111\32\109\117\108\116\105\112\108\101\32\111\117\116\112\117\116\115\10\32\32\32\32\105\102\32\116\121\112\101\40\118\49\41\32\61\61\32\34\110\117\109\98\101\114\34\32\116\104\101\110\10\32\32\32\32\32\32\32\32\111\117\116\95\118\49\32\61\32\118\49\32\43\32\49\10\32\32\32\32\101\110\100\10\32\32\32\32\105\102\32\116\121\112\101\40\118\50\41\32\61\61\32\34\110\117\109\98\101\114\34\32\116\104\101\110\10\32\32\32\32\32\32\32\32\111\117\116\95\118\50\32\61\32\118\50\32\43\32\49\10\32\32\32\32\101\110\100\10\32\32\32\32\105\102\32\116\121\112\101\40\118\51\41\32\61\61\32\34\110\117\109\98\101\114\34\32\116\104\101\110\10\32\32\32\32\32\32\32\32\111\117\116\95\118\51\32\61\32\118\51\32\43\32\49\10\32\32\32\32\101\110\100\10\32\32\32\32\105\102\32\116\121\112\101\40\118\52\41\32\61\61\32\34\110\117\109\98\101\114\34\32\116\104\101\110\10\32\32\32\32\32\32\32\32\111\117\116\95\118\52\32\61\32\118\52\32\43\32\49\10\32\32\32\32\101\110\100\10\32\32\32\32\114\101\116\117\114\110\32\111\117\116\95\118\49\44\32\111\117\116\95\118\50\44\32\111\117\116\95\118\51\44\32\111\117\116\95\118\52\32\45\45\116\104\101\115\101\32\100\111\32\110\111\116\32\104\97\118\101\32\116\111\32\98\101\32\97\108\108\32\101\120\105\115\116\105\110\103\46\32\73\102\32\110\111\116\32\101\120\105\115\116\44\32\116\104\101\110\32\97\117\116\111\109\97\116\105\99\97\108\108\121\32\97\115\115\105\103\110\101\100\32\119\105\116\104\32\110\105\108\10\101\110\100\10\10\97\44\32\98\44\32\99\44\32\100\32\61\32\103\101\116\69\97\99\104\86\97\114\105\97\98\108\101\80\108\117\115\49\40\51\44\49\51\44\50\51\44\34\110\110\34\41\32\45\45\116\104\101\32\108\97\115\116\32\111\110\101\32\119\111\110\39\116\32\111\117\116\112\117\116\10\112\114\105\110\116\40\115\116\114\105\110\103\46\102\111\114\109\97\116\40\34\118\97\108\117\101\115\32\111\102\32\97\44\32\98\44\32\99\44\32\100\32\97\114\101\32\37\115\44\32\37\115\44\32\37\115\44\32\37\115\34\44\32\97\44\32\98\44\32\99\44\32\100\41\41\10\114\70\49\32\61\32\70\49\40\41\10\112\114\105\110\116\40\34\84\104\101\32\114\101\116\117\114\110\32\111\102\32\70\49\32\105\115\32\34\44\32\114\70\49\41\10\10\45\45\105\102\32\110\117\109\98\101\114\32\111\102\32\118\97\114\105\97\98\108\101\115\32\116\111\32\116\97\107\101\32\102\117\110\99\116\105\111\110\32\114\101\116\117\114\110\32\105\115\32\115\109\97\108\108\101\114\32\116\104\97\110\32\97\99\116\117\97\108\32\114\101\116\117\114\110\115\44\32\116\104\101\110\32\116\104\101\32\114\101\115\116\32\119\105\108\108\32\98\101\32\100\114\111\112\112\101\100\10\97\113\44\32\98\113\32\61\32\103\101\116\69\97\99\104\86\97\114\105\97\98\108\101\80\108\117\115\49\40\52\44\54\44\49\44\51\41\10\112\114\105\110\116\40\115\116\114\105\110\103\46\102\111\114\109\97\116\40\34\118\97\108\117\101\32\111\102\32\97\113\44\32\98\113\32\97\114\101\32\37\115\44\32\37\115\34\44\32\97\113\44\32\98\113\41\41\32\45\45\111\110\108\121\32\116\104\101\32\102\105\114\115\116\32\116\119\111\32\97\114\101\32\114\101\116\117\114\110\101\100\44\32\98\117\116\32\116\104\101\32\114\101\115\116\32\97\114\101\32\100\114\111\112\112\101\100\10\10\45\45\67\97\110\32\73\32\103\101\116\32\116\104\101\32\108\97\115\116\32\116\119\111\44\32\100\114\111\112\32\116\104\101\32\102\105\114\115\116\32\116\119\111\63\10\95\44\32\95\44\32\99\113\44\32\100\113\32\61\32\103\101\116\69\97\99\104\86\97\114\105\97\98\108\101\80\108\117\115\49\40\52\44\54\44\49\44\51\41\10\112\114\105\110\116\40\115\116\114\105\110\103\46\102\111\114\109\97\116\40\34\118\97\108\117\101\32\111\102\32\99\113\44\32\100\113\32\97\114\101\32\37\115\44\32\37\115\34\44\32\99\113\44\32\100\113\41\41\10\10\112\114\105\110\116\40\34\66\117\116\32\112\114\105\110\116\32\98\121\32\100\101\102\97\117\108\116\32\112\114\105\110\116\115\32\97\108\108\32\114\101\116\117\114\110\32\118\97\108\117\101\115\32\111\102\32\97\32\102\117\110\99\116\105\111\110\34\41\10\112\114\105\110\116\40\115\116\114\105\110\103\46\102\105\110\100\40\39\101\103\103\119\101\116\39\44\32\39\119\101\39\41\41\32\45\45\115\116\114\105\110\103\46\102\105\110\100\32\114\101\116\117\114\110\115\32\50\32\118\97\108\117\101\115\10\112\114\105\110\116\40\34\73\32\99\97\110\32\102\111\114\99\101\32\105\116\32\116\111\32\112\114\105\110\116\32\111\110\108\121\32\111\110\101\32\118\97\108\117\101\34\41\10\112\114\105\110\116\40\40\115\116\114\105\110\103\46\102\105\110\100\40\39\101\103\103\119\101\116\39\44\32\39\119\101\39\41\41\41\10\10\45\45\115\97\109\101\32\97\115\32\83\119\105\102\116\44\32\76\117\97\32\102\117\110\99\116\105\111\110\32\99\97\110\32\97\108\115\111\32\114\101\116\117\114\110\32\97\32\102\117\110\99\116\105\111\110\10\112\114\105\110\116\40\34\97\32\102\117\110\99\116\105\111\110\32\116\104\97\116\32\111\117\116\112\117\116\115\32\97\32\102\117\110\99\116\105\111\110\34\41\10\99\97\108\99\117\108\97\116\111\114\32\61\32\102\117\110\99\116\105\111\110\40\111\112\101\114\97\116\111\114\41\10\32\32\32\32\105\102\32\111\112\101\114\97\116\111\114\32\61\61\32\39\43\39\32\116\104\101\110\10\32\32\32\32\32\32\32\32\114\101\116\117\114\110\32\102\117\110\99\116\105\111\110\40\97\44\98\41\10\32\32\32\32\32\32\32\32\32\32\32\32\114\101\116\117\114\110\32\97\43\98\10\32\32\32\32\32\32\32\32\32\32\32\32\101\110\100\10\32\32\32\32\101\108\115\101\105\102\32\111\112\101\114\97\116\111\114\32\61\61\32\39\45\39\32\116\104\101\110\10\32\32\32\32\32\32\32\32\114\101\116\117\114\110\32\102\117\110\99\116\105\111\110\40\97\44\98\41\10\32\32\32\32\32\32\32\32\32\32\32\32\114\101\116\117\114\110\32\97\45\98\10\32\32\32\32\32\32\32\32\32\32\32\32\101\110\100\10\32\32\32\32\101\108\115\101\10\32\32\32\32\32\32\32\32\114\101\116\117\114\110\32\102\117\110\99\116\105\111\110\40\41\10\32\32\32\32\32\32\32\32\32\32\32\32\101\110\100\10\32\32\32\32\101\110\100\10\101\110\100\10\10\103\101\116\67\97\108\99\32\61\32\99\97\108\99\117\108\97\116\111\114\40\39\116\39\41\10\112\114\105\110\116\40\34\103\101\116\67\97\108\99\40\50\44\51\41\61\34\44\32\103\101\116\67\97\108\99\40\50\44\51\41\41\10\10\45\45\108\111\99\97\108\32\97\110\100\32\103\108\111\98\97\108\32\118\97\114\105\97\98\108\101\10\112\114\105\110\116\40\34\108\111\99\97\108\32\118\97\114\105\97\98\108\101\32\97\110\100\32\103\108\111\98\97\108\32\118\97\114\105\97\98\108\101\34\41\10\102\117\110\99\116\105\111\110\32\108\111\99\40\41\10\32\32\32\32\103\98\118\32\61\32\49\48\10\101\110\100\10\108\111\99\40\41\10\112\114\105\110\116\40\34\103\98\118\44\32\119\104\105\99\104\32\105\115\32\97\32\103\108\111\98\97\108\32\118\97\114\105\97\98\108\101\44\32\105\115\32\110\111\119\32\34\44\32\103\98\118\41\10\102\117\110\99\116\105\111\110\32\108\111\99\50\40\41\10\32\32\32\32\108\111\99\97\108\32\108\99\118\32\61\32\49\48\10\101\110\100\10\108\111\99\50\40\41\10\112\114\105\110\116\40\34\108\99\118\44\32\119\104\105\99\104\32\105\115\32\97\32\108\111\99\97\108\32\118\97\114\105\97\98\108\101\44\32\105\115\32\110\111\119\34\44\32\108\99\118\41\10\10\112\114\105\110\116\40\34\101\120\105\115\116\105\110\103\32\118\97\114\105\97\98\108\101\115\58\34\41\10\102\111\114\32\105\44\118\32\105\110\32\112\97\105\114\115\40\95\71\41\32\100\111\32\45\45\95\71\32\105\115\32\97\32\118\97\114\105\97\98\108\101\32\115\116\111\114\105\110\103\32\97\108\108\32\108\111\97\100\101\100\32\116\104\105\110\103\115\10\32\32\32\32\112\114\105\110\116\40\105\44\118\41\10\101\110\100\10\112\114\105\110\116\40\34\108\111\97\100\101\100\32\112\97\99\107\97\103\101\115\58\34\41\10\102\111\114\32\105\44\118\32\105\110\32\112\97\105\114\115\40\112\97\99\107\97\103\101\46\108\111\97\100\101\100\41\32\100\111\10\32\32\32\32\112\114\105\110\116\40\105\44\118\41\10\101\110\100\10\10\45\45\102\117\110\99\116\105\111\110\32\99\97\110\32\97\108\115\111\32\98\101\32\115\97\118\101\100\32\97\115\32\115\116\114\105\110\103\10\112\114\105\110\116\40\34\100\117\109\112\32\102\117\110\99\116\105\111\110\34\41\10\102\117\110\99\95\99\111\110\116\101\110\116\32\61\32\115\116\114\105\110\103\46\100\117\109\112\40\70\49\41\10\112\114\105\110\116\40\34\116\121\112\101\32\111\102\32\102\117\110\99\95\99\111\110\116\101\110\116\32\105\115\34\44\32\116\121\112\101\40\102\117\110\99\95\99\111\110\116\101\110\116\41\41\10\112\114\105\110\116\40\115\116\114\105\110\103\46\98\121\116\101\40\102\117\110\99\95\99\111\110\116\101\110\116\41\41\32\45\45\32\105\116\32\106\117\115\116\32\115\104\111\119\115\32\76\117\97\84\46\32\78\111\32\119\111\114\114\105\101\115\46\32\105\116\32\105\115\32\98\121\116\101\115\44\32\97\110\100\32\115\104\111\119\110\32\97\115\32\76\117\97\84\10\45\45\104\116\116\112\115\58\47\47\115\116\97\99\107\111\118\101\114\102\108\111\119\46\99\111\109\47\113\117\101\115\116\105\111\110\115\47\54\48\57\52\55\55\49\47\100\101\99\114\121\112\116\45\108\117\97\45\98\121\116\101\45\99\111\100\101\10\45\45\105\102\32\121\111\117\32\119\97\110\116\32\116\111\32\114\101\97\100\32\116\104\101\32\119\104\111\108\101\32\98\121\116\101\115\10\112\114\105\110\116\40\34\114\101\97\100\32\98\121\116\101\115\34\41\10\98\117\102\102\32\61\32\34\34\10\102\111\114\32\118\61\49\44\115\116\114\105\110\103\46\108\101\110\40\102\117\110\99\95\99\111\110\116\101\110\116\41\32\100\111\10\32\32\32\32\98\117\102\102\32\61\32\98\117\102\102\32\46\46\32\39\92\92\39\32\46\46\32\115\116\114\105\110\103\46\98\121\116\101\40\102\117\110\99\95\99\111\110\116\101\110\116\44\32\118\41\10\32\32\32\32\101\110\100\10\112\114\105\110\116\40\98\117\102\102\41\10\70\49\67\111\112\105\101\100\32\61\32\108\111\97\100\40\102\117\110\99\95\99\111\110\116\101\110\116\41\10\70\49\67\111\112\105\101\100\40\41\32\45\45\119\111\114\107\115\10\10\10\10\10\10\10\32\32\32\32\10\132\134\0\0\2\132\11\0\0\0\131\128\0\0\68\0\2\1\71\0\1\0\130\4\134\112\114\105\110\116\4\148\84\104\105\115\32\105\115\32\102\117\110\99\116\105\111\110\32\70\49\129\0\0\0\128\132\1\0\0\1\128\128\129\133\95\69\78\86
转换为二进制,就是该函数的二进制码。
三、读取
Lua中有一个函数叫load。该函数可以读取函数的字节码,并转化为Lua函数。
使用方式见博文[6]。
F1Copied = load(func_content)
F1Copied()
--This is function F1
F1Copied()完美还原了原函数F1()。
四、作用
这个功能在多人协作时有用。例如,甲在编写项目时,需要调用乙写的函数,且乙的函数随着游戏场景的变化而变化,但甲乙双方都不愿意对方查看自己的具体代码。此时,乙可以把函数的二进制码通过Lua的文件操作,保存在文件中,而甲的程序需要乙的函数时,只需load该文件即可。无论乙的场景如何变化,只要保存二进制码的文件名不变,就不会影响甲读取函数。
读取和书写文件的操作见[7]。
file=io.open("function.txt","w")
file:write(func_content)
io.close()
五、小结
在Lua中,函数可以被保存为二进制格式,可以显示二进制,但如果直接用print只会出现LuaT,应当用string.byte函数把字节码提取出来。最后,用load函数把字节码重新转化为函数即可使用。这个功能在多人协作编写游戏时可用。
参考资料
[1]Lua学习(4)Lua变量定义以及数据类型-CSDN博客
[2]lua——string库函数的用法例子(包括string.dump的用法例子)-CSDN博客
[3]encryption - decrypt new lua script called LuaT - Stack Overflow
[4]bytecode - Decrypt Lua byte code? - Stack Overflow
[5]Lua_第19章 String 库(上)_string.find函数第三个参数是可选的:标示目标串中搜索的起始位置。当我们想查找目-CSDN博客
[6]lua string.dump-CSDN博客
[7]Lua开发--文件读写操作_lua 读写文件-CSDN博客