`
lobin
  • 浏览: 425698 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

lua

 
阅读更多

arg

argstest.lua

print(arg)
print(type(arg))

if arg ~= nil then 
  print("------")
  print(arg[-1])
  print(arg[0])
  print("------")
  for i, v in ipairs(arg) do
    print(i .. "->" .. v)
    print(tostring(i) .. "->" .. tostring(v))
  end
end

  

>lua argstest.lua a b c 1 2 3
table: 003CA608
table
------
lua
argstest.lua
------
1->a
1->a
2->b
2->b
3->c
3->c
4->1
4->1
5->2
5->2
6->3
6->3

 

字符串

字符串长度

> s = "abcdefg"
> print(#s)
7

 还可以通过string.len (s)来得到字符串的长度

> print(string.len(s))
7

 

 

table

> t = {["a"] = "a1", ["b"] = "b1", ["c"] = "c1", ["d"] = "d1"}

> print(t)

table: 003CC548

> print(type(t))

table

 

table长度

> t = {}
> print(#t)
0

> t = {"a", "b", "c", "d", "e"}
> print(#t)
5

> t = {"a", "b", "c", "d", "e", nil, nil, nil}
> print(#t)
5

> t = {"a", "b", "c", "d", "e", nil, nil, nil, "f", "g"}
> print(#t)
10

 

还可以

> t = {}
> print(table.getn(t))
0
> t = {"a", "b", "c", "d", "e"}
> print(table.getn(t))
5
> t = {"a", "b", "c", "d", "e", nil, nil, nil}
> print(table.getn(t))
5
> t = {"a", "b", "c", "d", "e", nil, nil, nil, "f", "g"}
> print(table.getn(t))
10

 

> table.setn(t, 8)
stdin:1: 'setn' is obsolete

 

> t = {1, 2, nil, 3, 4}
> print(ipairs(t))
function: 003C62A8      table: 003CC528 0

 

> t = {1, 2, nil, 3, 4}
> print(pairs(t))
function: 003C6318      table: 003CC528 nil

 

 

> t = {}
> print(next(t))
nil

> t = {1, 2, 3}
> print(next(t))
1       1

> t = {nil, 1, 2, 3}
> print(next(t))
2       1

 

 

function

function在lua中也是一种类型。可以将一个函数赋值给变量。

> fx = function (arg)  print(arg) end

 然后进行调用:

> fx("greeting")
greeting

 

> function fx(arg)
>>  print("args:" .. arg)
>> end
> fx("greeting")
args:greeting
> fx1 = fx
> fx1("greeting")
args:greeting

 

 

> function fx(arg)
>>  print(arg)
>> end

 

> fx("greeting")
greeting

 

> fx "greeting"
greeting

 

匿名函数

> pcall(function(arg)
>>  print(arg)
>> end, "greeting")
greeting

 

 

> print(t.a)

a1

> print(t["a"])

a1

 

 

> a = "abcdefg"

> print(a)

abcdefg

> print(type(a))

string

 

> a = 12

> print(a)

12

> print(type(a))

number

 

> a = nil

> print(a)

nil

> print(type(a))

nil

 

> a = true

> print(a)

true

> print(type(a))

boolean

 

> a = {}

> print(a)

table: 003CD2B8

> print(type(a))

table

 

> t = {["a"] = "a1", ["b"] = "b1", ["c"] = "c1", ["d"] = "d1"}

> print(t)

table: 003CC548

> print(type(t))

table

 

> iarray = require("iarray")

> print(iarray)

table: 003CD908

> print(type(iarray))

table

 

> a = iarray.new(10)

44bytes allocated.

> print(a)

userdata: 003CC9D0

> print(type(a))

userdata

 

> a = function() end

> print(a)

function: 003CDF08

> print(type(a))

function

 

> co = coroutine.create(a)

> print(co)

thread: 003C6B28

> print(type(co))

thread

 

function

上面提到lua中的函数也是一种类型,可以赋值绑定给一个变量。

函数定义:

stat ::= function funcname funcbody
funcname ::= Name {‘.’ Name} [‘:’ Name]
funcbody ::= ‘(’ [parlist] ‘)’ block end

 lua还可以定义匿名函数

函数定义:

functiondef ::= function funcbody
funcbody ::= ‘(’ [parlist] ‘)’ block end

 lua函数还可以是local函数

函数定义:

stat ::= local function Name funcbody
funcbody ::= ‘(’ [parlist] ‘)’ block end

  

定义一个table:

> t = {}
> print(t)
table: 003CF2C8
> print(type(t))
table

 

> function t:fx1()
>>  print("greeting")
>> end

> t:fx1()
greeting

 

> function t.fx2()
>>  print("greeting")
>> end

> t.fx2()
greeting

 

不定长变量

> function fx(...)
>>  for i, v in ipairs(arg) do
>>    print(i .. "->" .. v)
>>  end
>> end
> fx()
> fx("a")
1->a
> fx("a", "b", "c", "e", "f", "g")
1->a
2->b
3->c
4->e
5->f
6->g

 

 

dump例子

dump.lua

-- local fd = io.input("./cmodule/alloc/iarray.lib")
-- local fd = io.input("./cmodule/alloc/alloc.cpp")
local fd = io.input("./cmodule/alloc/Makefile")
local content = fd:read("*a")
local len = string.len(content)

local fragment = ""
local origin = "";
for i = 1, len do
  local b = string.byte(content, i)
  local btn = tonumber(b)
  local hex = string.format("%02X", btn)
  fragment = fragment..hex

  -- local c = string.sub(content, i, i)
  local c = string.char(b)
  if c == "\r" or c == "\n" then 
    c = "_"
  end
  origin = origin..c
  if string.len(fragment) == 32 then
    print(fragment, origin)
    fragment = ""
    origin = ""
  end
end
while string.len(fragment) < 32 do
  fragment = fragment.." "
end
print(fragment, origin)
fragment = ""
origin = ""

 

>lua dump.lua
56435F504154483D443A5C7573725C62        VC_PATH=D:\usr\b
696E5C4D6963726F736F667420566973        in\Microsoft Vis
75616C2053747564696F5C564339380A        ual Studio\VC98_
434C3D22242856435F50415448295C42        CL="$(VC_PATH)\B
696E5C636C2E657865220A4C494E4B3D        in\cl.exe"_LINK=
22242856435F50415448295C42696E5C        "$(VC_PATH)\Bin\
6C696E6B2E657865220A0A0A494E434C        link.exe"___INCL
5544453D22242856435F50415448295C        UDE="$(VC_PATH)\
496E636C756465220A4C49423D222428        Include"_LIB="$(
56435F50415448295C4C6962220A0A4C        VC_PATH)\Lib"__L
55415F504154483D443A5C7573725C62        UA_PATH=D:\usr\b
696E5C4C75615C352E310A494E434C55        in\Lua\5.1_INCLU
44455F4C55413D2224284C55415F5041        DE_LUA="$(LUA_PA
5448295C696E636C756465220A4C4942        TH)\include"_LIB
5F4C55413D2224284C55415F50415448        _LUA="$(LUA_PATH
295C6C6962220A0A230A44454255473D        )\lib"__#_DEBUG=
2E0A0A4255494C443A0A092428434C29        .__BUILD:_      $(CL)
202F4758202F5733202F49202428494E         /GX /W3 /I $(IN
434C55444529202F492428494E434C55        CLUDE) /I$(INCLU
44455F4C554129202F63202F466F2428        DE_LUA) /c /Fo$(
4445425547292F202A2E6370700A0924        DEBUG)/ *.cpp_  $
284C494E4B29202F444C4C202F4C4942        (LINK) /DLL /LIB
504154483A24284C494229202F4C4942        PATH:$(LIB) /LIB
504154483A24284C49425F4C55412920        PATH:$(LIB_LUA)
2F4F55543A24284445425547292F6961        /OUT:$(DEBUG)/ia
727261792E646C6C2024284445425547        rray.dll $(DEBUG
292F2A2E6F626A0A09                      )/*.obj_

 

 

Lua Socket开发 

kad.lua

local socket = require("socket")
local tcp, err = socket.tcp()
if tcp == nil then
  print(err)
  error()
end


tcp:setoption("reuseaddr",true)
local result, err = tcp:bind("localhost", 3131)
print(result)
print(err)
if result == nil then
  print(err)
  error()
end


result,err = tcp:listen(50)
if result == nil then
  print(err)
  error()
end

print "listening"

local stop = false

while not stop do 
  tcp:settimeout(0.01)
  local client, err = tcp:accept()
  if client ~= nill then 
    local co 
    local fn = function(sock) 
      print(co)
      while not stop do
        local rb, err = sock:receive()
	print ""
        if rb ~= nil then 
          if rb == "STOP" then
	    stop = true
	  else
	    print("read "..rb)
	    sock:send(rb)
	  end
        end
      end
      -- coroutine.resume(co, sock)
    end
    co = coroutine.create(fn)
    coroutine.resume(co, client)
  end
end

 

运行服务端程序:

>lua kad.lua
1
nil
listening

 

运行Telnet连接到服务器:

>telnet localhost 3131

 

>lua kad.lua
1
nil
listening
thread: 003C6B68

read abcdefg

read abcdefg

read abcdefg

read 1111111

 

servertest1.lua

local socket = require("socket")
local tcp, err = socket.tcp()
if tcp == nil then
  print(err)
  error()
end


tcp:setoption("reuseaddr",true)
local result, err = tcp:bind("localhost", 3131)
print(result)
print(err)
if result == nil then
  print(err)
  error()
end



result,err = tcp:listen(50)
if result == nil then
  print(err)
  error()
end

local ip, port = tcp:getsockname()
print("listening " .. ip .. ":" .. port)

local stop = false

local ctb = {}


while not stop do 
  tcp:settimeout(0.01)
  local client, err = tcp:accept()
  if client ~= nill then 
    local ip, port = client:getpeername()
    print("new conn from " .. ip .. ":" .. port)
    
    ctb[client] = {socket = client} 
    local ip, port = ctb[client].socket:getpeername()
  end

  for sock, ctx in pairs(ctb) do 
    local recvt, sendt, status = socket.select({sock}, nil, 1)
    if #recvt > 0 then
      local rb, err = sock:receive()
      if rb ~= nil then 
        if rb == "STOP" then
          stop = true
        else
          print("read "..rb)
          sock:send(rb)
        end
      end
    end 
  end 
end

 

>lua servertest1.lua
1
nil
listening 127.0.0.1:3131
new conn from 127.0.0.1:4141
read 111111
read 222222
new conn from 127.0.0.1:4144
read aaaaaa
read ddddd
new conn from 127.0.0.1:4145
read abcdefg
read hijklmn

 

 

Lua C模块开发

 

Lua C模块开发

 

iarray例子

例子工程文件列表:

>tree . /F

卷 D 的文件夹 PATH 列表

卷序列号为 F075-351A

D:\***\ALLOC

    alloc.cpp

    alloc.obj

    iarray.dll

    iarray.exp

    iarray.lib

    liballoc.cpp

    liballoc.obj

    Makefile

 

没有子文件夹

 

alloc.cpp

#pragma comment(lib, "lua5.1.lib")
extern "C"
{
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
};


typedef struct 
{
	int size;
	int *data;
} array_it;

_declspec(dllexport) int i_array_new(lua_State *L)
{
    int n = luaL_checkint(L, 1);
	size_t nbytes = sizeof(array_it) + (n - 1) * sizeof(int);
	array_it *i = (array_it *) lua_newuserdata(L, nbytes);
	i->size = n;
	printf("%dbytes allocated.\n", nbytes);  
	return 1;
}

static const luaL_Reg iarray[]=
{
	{"new",i_array_new},
	{NULL, NULL}
}; 

extern "C" _declspec(dllexport) int luaopen_iarray(lua_State *L) 
{
	luaL_openlib(L, "iarray", iarray, 0);
	return 1;
}

 

liballoc.cpp

#include <windows.h>

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

DllMain函数是可选的,所以liballoc.cpp也可以不需要。

Makefile

VC_PATH=D:\***
CL="$(VC_PATH)\Bin\cl.exe"
LINK="$(VC_PATH)\Bin\link.exe"


INCLUDE="$(VC_PATH)\Include"
LIB="$(VC_PATH)\Lib"

LUA_PATH=D:\***\5.1
INCLUDE_LUA="$(LUA_PATH)\include"
LIB_LUA="$(LUA_PATH)\lib"

#
DEBUG=.

BUILD:
	$(CL) /GX /W3 /I $(INCLUDE) /I$(INCLUDE_LUA) /c /Fo$(DEBUG)/ *.cpp
	$(LINK) /DLL /LIBPATH:$(LIB) /LIBPATH:$(LIB_LUA) /OUT:$(DEBUG)/iarray.dll $(DEBUG)/*.obj
	

 

编译链接生产动态链接库:

>nmake
...
alloc.cpp
liballoc.cpp
Generating Code...
...
Creating library ./iarray.lib and object ./iarray.exp

 

 

将动态链接库iarray.dll拷贝到<LUA_HOME>\clibs目录下:

>cp -rf iarray.dll D:\***\clibs

 

>lua

 

> iarray = require("iarray")
> print(iarray)
table: 003CD908
> a = iarray.new(10)
44bytes allocated.
> print(a)
userdata: 003CDD90

 

 Lua的一些资料:https://lobin.iteye.com/blog/2339953

 

dnsmasq_signals.lua

分享到:
评论

相关推荐

    LUAC反编译_LUC_lua反编译工具_luac_luac解密工具_Lua解密_

    Lua源代码是文本形式的,易于阅读和编写,但为了保护代码不被轻易篡改或盗用,开发者通常会将Lua代码编译成字节码(.lua.c文件或.luac文件)。"LUAC"就是Lua的官方编译器,它将Lua源代码转换为字节码,以提高执行...

    LUAC脚本解密_luac解密在线_luac4加密_luac反编译_luac4解密工具_luac解密工具

    LUAC脚本是一种基于Lua语言的编译格式,它将Lua源代码编译成字节码,以便在 Lua 解释器上高效运行。LUAC(Lua Compiler)是Lua官方提供的编译器,它将源代码转换为这种优化的字节码,以提高执行速度。在游戏开发、...

    lua_stm32f4.rar_lua stm32_lua移植stm32_stm32 lua_stm32f407移植lua_st

    《Lua在STM32F407上的移植与应用》 在嵌入式系统领域,为了提高代码的可读性、可维护性和灵活性,越来越多的开发者选择使用高级脚本语言,如Lua,来替代传统的C/C++编程。本文将详细探讨如何在STM32F407微控制器上...

    LUAC解密工具.zip_andlua解密工具_andlua解密软件_lua 4.2解密_luac转lua_lua解密工具

    "LUAC解密工具"就是针对Lua编译后的二进制文件(.luac)进行解密的工具,目的是为了让加密过的Lua代码能够恢复成可读的源代码格式(.lua)。 LUAC是Lua的编译器,它将Lua源代码转换为字节码,这个过程通常是为了...

    所有版本LUA源码

    所有版本LUA源码 lua-5.3.5 lua-5.3.4 lua-5.3.3 lua-5.3.2 lua-5.3.1 lua-5.3.0 lua-5.2.4 lua-5.2.3 lua-5.2.2 lua-5.2.1 lua-5.2.0 lua-5.1.5 lua-5.1.4 lua-5.1.3 lua-5.1.2 lua-5.1.1 lua-5.1 lua-5.0.3 lua-...

    介于许多小伙伴 打开lua官网很慢,下载lua源代码很慢,传一个lua5.4.6最新版本的源代码

    Lua是一种轻量级的脚本语言,主要用于嵌入到其他应用程序中以增加其功能和定制性。它的设计目标是简洁、高效和可扩展。在本文中,我们将详细探讨Lua 5.4.6这一最新版本的源代码及其相关知识点。 首先,让我们了解...

    Lua中文编辑器luaEditor

    Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。LuaEditor是一款专为Lua编程设计的中文编辑器,它为程序员提供了方便的开发环境,提高了编写和调试Lua代码的效率。luaEditor-v4.10是该...

    lua解密工具.apk

    lua解密工具.apk是一款用于解密Lua脚本的工具,适用于Android操作系统。Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和网络编程等领域。通过使用该工具,开发者可以对Lua脚本进行反编译、编辑和重新编译...

    Lua的最基本使用 C++与lua的互相调用

    使用`lua_pushnumber`、`lua_pushstring`等函数将C++数据推送到Lua栈,使用`lua_tonumber`、`lua_tostring`等函数从Lua栈获取数据。 6. 清理:调用`lua_settop(L, 0)`清空栈,防止内存泄漏。 二、Lua调用C++函数 ...

    LuaBitOp-1.0.2 lua位操作源码

    LuaBitOp-1.0.2 是一个针对 Lua 语言的位操作库,它提供了对二进制数据进行位运算的功能。位操作是计算机科学中的基础概念,它们在底层编程、数据处理和优化中有着广泛的应用。LuaBitOp 的源码可以帮助开发者深入...

    unity xlua lua5.4.4最新版lua库文件

    Unity是世界上最受欢迎的游戏开发引擎之一,它支持多种编程语言,其中就包括通过XLua插件使用的Lua。XLua是一个高效、强大的Lua脚本绑定工具,它使得开发者可以在Unity项目中利用Lua语言的强大功能,同时保持与C#...

    windows环境安装lua

    在Windows环境下安装Lua编程语言,主要是为了进行软件开发或脚本编写。Lua是一种轻量级、解释型的脚本语言,以其简洁的语法和高效性能而受到开发者喜爱。以下是关于在Windows上安装Lua 5.1.5版的详细步骤以及相关...

    lua编译&反编译,lua反编译工具,Java

    Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。它的源代码可读性高,易于学习和使用。在本文中,我们将深入探讨Lua的编译与反编译过程,以及相关的工具和技术。 首先,我们要理解Lua...

    Lua 5.2 Reference Manual(Lua 5.2引用指南)

    ### Lua 5.2 参考手册核心知识点详解 #### 一、引言与概述 **Lua** 是一种扩展编程语言,旨在支持通用的过程式编程,并具备数据描述能力。此外,Lua 还提供了面向对象编程、函数式编程以及数据驱动编程的良好支持...

    unity开发lua EmmyLua环境安装.zip

    《Unity开发Lua:EmmyLua环境安装详解》 在Unity引擎中使用Lua脚本语言,可以提高游戏开发的效率和灵活性。EmmyLua是专为Unity设计的一个强大的Lua集成开发环境,它提供了一整套方便的工具链,使得在Unity中编写、...

    lua 5.3.5 windows预编译exe/dll文件 lua5.3.5.win.zip

    lua5.3(32位/64位)windows 预编译(exe/DLL) adding: lua5.3.5-x86/lua.exe (in=14336) (out=7311) (deflated 49%) adding: lua5.3.5-x86/lua.o (in=24873) (out=9654) (deflated 61%) adding: lua5.3.5-x86/lua...

    Lua实例代码大全

    《Lua实例代码大全》是针对Lua编程语言的一份详尽实例集合,涵盖了多个核心库和扩展库的使用,包括luacurl(网络连接)、luafilesystem(文件系统操作)、luajson(JSON处理)、luasocket(网络套接字)、luasql...

    Lua脚本语言中文教程.pdf

    Lua是一种简单高效的脚本编程语言,由Roberto Ierusalimschy等编写,并由***翻译并发布。该语言简单易学,与C、Java等编程语言兼容性好,特别适用于需要脚本编程的场合,比如大型游戏中的剧情控制、手机应用开发等。...

    lua iconv For windows

    在windows下 用lua转换将gbk转为utf 8 2013 11 16 17:56 0人阅读 评论 0 收藏 编辑 删除 本来以为很简单 结果找了半天发现都是很坑爹的办法 linux下可以直接安装luaiconv windows下呢 只好自己编了 本来想找个别人写...

    lua-utf8.zip

    a utf-8 support module for Lua and LuaJIT 源码地址:https://github.com/starwing/luautf8 编译后可用的库: Linux版:lua-utf8.so Windows版:lua-utf8.dll(若是用在openresty中,openresty版本需使用32位版本...

Global site tag (gtag.js) - Google Analytics