Lua, 将 CR 改正为 CRLF

我有一个 Lua 文件。它会读取两个文件,一个是“脚本”文件,一个是“源码”文件。Lua 文件解释脚本文件,并使用脚本文件中的一些指令更改源码文件(在内存中)。然后将这个修改后的源代码输出到输出文件中。这个功能一直很好,直到有 CR 出现。修改后的源代码会被修改为 CRLF,这会破坏很多东西,我不知道该如何解决。下面是 Lua 文件的代码:

progargs = {...}

if #progargs ~= 3 then
    print("使用方式:patch <src> <script> <output>")
    return "你没做对"
end

opcodes = {
    ["\000"] = {
        function(args)
            local inp=outc:sub(pos,pos):byte()
            strt={}
            for j=1,#src do
                table.insert(strt,outc:sub(j,j))
            end
            strt[pos]=string.char(inp-args[1])
            outc=table.concat(strt,"")
        end,
        1
    },
    ["\080"] = {
        function(args)
            local val = args[4] * 1 + args[3] * 256 + args[2] * 65536 + args[1] * 16777216
            pos = val+1
        end,
        4
    },
    ["\255"] = {
        function(args)
            local inp=outc:sub(pos,pos):byte()
            strt={}
            for j=1,#src do
                table.insert(strt,outc:sub(j,j))
            end
            strt[pos]=string.char(inp+args[1])
            outc=table.concat(strt,"")
        end,
        1
    },
}

srcf = io.open(progargs[1])
src = srcf:read("*a")
srcf:close()

scrf = io.open(progargs[2])
scr = scrf:read("*a")
scrf:close()
i=1
pos=1
outc=src
while i<scr:len() do
    local opc = scr:sub(i,i)
    if opcodes[opc] ~= nil then
        local argc = opcodes[opc][2]
        local func = opcodes[opc][1]
        local args = {}
        for j=1,argc do
            table.insert(args,scr:sub(i+j,i+j):byte())
        end
        func(args)
        i=i+argc+1
    else
        print("未知的操作码 XD 爱咋咋地")
        i=i+1
    end
end
print("搞定啦")
outf = io.open(progargs[3], "w")
outf:write(outc)
outf:close()

欢迎提供任何解决方法。

点赞
用户2694568
用户2694568

当使用 io.open 打开二进制文件时,必须在模式字符串中添加 "b",否则在 Windows 上可能会遇到问题。

简单的模型函数 io.input 和 io.output 总是以文本模式打开文件(默认情况下)。在 Unix 中,二进制文件和文本文件没有区别。但在一些系统中,尤其是 Windows,必须使用特殊标志打开二进制文件。要处理这样的二进制文件,必须使用带有字母“b”的模式字符串的 io.open。

来源:https://www.lua.org/pil/21.2.2.html

2017-05-14 17:41:05