免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: __BlueGuy__
打印 上一主题 下一主题

[函数] 纪念我的第一个Lua程序 [复制链接]

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
51 [报告]
发表于 2012-10-20 20:32 |只看该作者
本帖最后由 __BlueGuy__ 于 2012-10-20 20:39 编辑
linux_c_py_php 发表于 2012-10-20 20:25
脚本嘛, 一定要选一个公认优秀的, 就像python的设计一样.


我们这里用的是十几年前的引擎,据我所知,这个引擎还在被大多数公司使用,
脚本用的是 Lua, 是规定死的, 没的选择, 也没必要选择...

估计 100 年都不会换脚本语言...

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
52 [报告]
发表于 2012-10-20 20:37 |只看该作者
本帖最后由 __BlueGuy__ 于 2012-10-20 20:41 编辑

>lua -e "io.stdout:setvbuf 'no'" "a.lua"
lua: a.lua:6: bad argument #1 to 'load' (function expected, got string)
stack traceback:
        [C]: in function 'load'
        a.lua:6: in main chunk
        [C]: ?
>Exit code: 1

io.input "in.txt"

local input = io.read "*a"
    :gsub("^char %w+%b[]%b[]%s*=%s*", "")

local res = assert(load("return "..input))()

local function write_short(n)
    io.write(("%c%c"):format(math.floor(n/256)%256, n%256))
end

local function write_byte(n)
    io.write(("%c"):format(n%256))
end

write_short(#res)
for i, v in ipairs(res) do
    write_short(#v)
    for i, v in ipairs(v) do
        write_byte(v)
    end
end

io.output "out.txt"

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
53 [报告]
发表于 2012-10-20 20:46 |只看该作者
回复 52# __BlueGuy__


    亲爱的BlueGuy同学,为什么在2012年的今天,你还在用06年才推出的Lua 5.1呢?这年头,大家都是用5.2的…………

load是5.2的函数………………

算了,给你一个5.1版本的吧……我都不知道我自己这里跑不跑的了……
  1. io.input "in.txt"
  2. -- io.output "out.dat"

  3. local input = io.read "*a"
  4.     :gsub("^char%s*%w+%b[]%b[]%s*=%s*", "")

  5. local res = assert(loadstring("return "..input))()

  6. local function write_binary(f)
  7.     local function write_short(n)
  8.         io.write(("%c%c"):format(math.floor(n/256)%256, n%256))
  9.     end

  10.     local function write_byte(n)
  11.         io.write(("%c"):format(n%256))
  12.     end
  13.     f(write_short, write_byte)
  14. end

  15. local function write_text(f)
  16.     local t = {}
  17.     local function write_short(n)
  18.         t[#t+1] = math.floor(n/256)%256
  19.         t[#t+1] = n%256
  20.     end
  21.     local function write_byte(n)
  22.         t[#t+1] = n%256
  23.     end
  24.     f(write_short, write_byte)
  25.     for i, v in ipairs(t) do
  26.         io.write(("%02X"):format(v))
  27.         if i % 16 == 0 then
  28.             io.write '\n'
  29.         elseif i % 2 == 0 then
  30.             io.write ' '
  31.         end
  32.     end
  33.     io.write '\n'
  34. end

  35. ("binary" and write_binary or write_text) (
  36. function(write_short, write_byte)
  37.     write_short(#res)
  38.     for i, v in ipairs(res) do
  39.         write_short(#v)
  40.         for i, v in ipairs(v) do
  41.             write_byte(v)
  42.         end
  43.     end
  44. end)

  45. -- cc: cc='lua51' run+='< in.txt'
复制代码
这个程序会读同一个目录下的in.txt文件。输出到终端,如果解注释掉第二行,则输出到out.txt,如果在"binary"前面加一个not,则直接输出文本的16进制数字串。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
54 [报告]
发表于 2012-10-20 20:48 |只看该作者
回复 52# __BlueGuy__


    上面的代码,如果你不想要某个功能(写二进制,或者写文本),可以直接删掉那个函数即可。

最先的代码,你只要把load改成loadstring就能跑。

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
55 [报告]
发表于 2012-10-20 20:50 |只看该作者
本帖最后由 __BlueGuy__ 于 2012-10-20 20:51 编辑

是不是我写错了, ?

io.input "in.txt"

local input = io.read "*a"
    :gsub("^char %w+%b[]%b[]%s*=%s*", "")

local res = assert(loadstring("return "..input))()

local function write_short(n)
    io.write(("%c%c"):format(math.floor(n/256)%256, n%256))
end

local function write_byte(n)
    io.write(("%c"):format(n%256))
end

write_short(#res)
for i, v in ipairs(res) do
    write_short(#v)
    for i, v in ipairs(v) do
        write_byte(v)
    end
end

io.output "out.txt"

>lua -e "io.stdout:setvbuf 'no'" "a.lua"
>Exit code: 0

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
56 [报告]
发表于 2012-10-20 20:53 |只看该作者
没写错……而且肯定输出了,只是scite自己不认那些控制字符(字符串的第一个byte可是00啊!!)

io.output 'out.txt'放到最前,紧靠io.input那行即可。恩,你离成功就一步了。

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
57 [报告]
发表于 2012-10-20 20:57 |只看该作者
本帖最后由 __BlueGuy__ 于 2012-10-20 21:00 编辑

回复 56# starwing83
输出格式有点问题,维度是2个字节

真的成功了, 比较有实用价值的 Lua 程序, 纪念一下
   

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
58 [报告]
发表于 2012-10-20 21:01 |只看该作者
回复 57# __BlueGuy__


    你看,lua只用了20行,C的话要多少捏………………

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
59 [报告]
发表于 2012-10-20 21:28 |只看该作者
回复 58# starwing83


不知其所以然, Lua 方便,C 有趣...   

论坛徽章:
0
60 [报告]
发表于 2012-10-20 21:40 |只看该作者
以前用它写过wireshark脚本,现在全忘了啊!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP