2017-05-14 32 views
2

我有一個lua文件。它讀取2個文件,一個「腳本」文件,一個「源」文件。 lua文件解釋腳本文件,並用腳本文件中的一些指令更改源文件(內存中)。然後將這個修改的源輸出到輸出文件中。這工作正常,直到某些CR。修改的源將被修改爲具有CRLF而不是CR。這打破了很多東西,我不知道如何解決這個問題。下載lua文件。Lua,CR更正爲CRLF

progargs = {...} 

if #progargs ~= 3 then 
    print("Usage: patch <src> <script> <output>") 
    return "u didnt do it right" 
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("unknown opcode xd fuck u") 
     i=i+1 
    end 
end 
print("doned") 
outf = io.open(progargs[3], "w") 
outf:write(outc) 
outf:close() 

有關如何解決此問題的任何方法,將不勝感激。

+1

尼斯*未知的操作碼*消息你那裏。 –

+0

@邁克爾只有最好的 – Epic8009

回答

6

將二進制文件與io.open一起使用時,必須在模式字符串中添加「b」,否則會在Windows上遇到問題。

簡單模型函數io.input和io.output始終以文本模式(默認值)打開文件 。在Unix中, 二進制文件和文本文件沒有區別。但在某些系統中,特別是Windows, 二進制文件必須用特殊標誌打開。要處理這樣的二進制文件,你必須使用io.open,在模式字符串中帶字母'b'。

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