2017-05-14 7 views
2

루아 파일이 있습니다. 그것은 2 개의 파일, 하나의 "스크립트"파일, 하나의 "소스"파일을 읽습니다. lua 파일은 스크립트 파일을 해석하고 스크립트 파일의 일부 명령으로 소스 파일 (메모리)을 변경합니다. 그런 다음 수정 된 소스를 출력 파일로 출력합니다. 이것은 일종의 CR이 될 때까지 잘 작동합니다. 수정 된 소스가 CR 대신 CRLF로 수정됩니다. 이것은 많은 것들을 부러 뜨 렸고, 나는 이것을 고치는 법을 모른다. 루아 파일을 보냅니다.루아, CRLF 수정 CR

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

@Michael 만 가장 좋은 – Epic8009

답변

6

바이너리 파일과 함께 io.open을 사용하려면 "b"를 모드 문자열에 추가해야합니다. 그렇지 않으면 Windows에서 문제가 발생합니다.

단순한 모델 함수 인 io.input 및 io.output은 항상 텍스트 모드 (기본값)로 파일을 엽니 다. 유닉스에서는 바이너리 파일과 텍스트 파일간에 차이가 없다. 그러나 일부 시스템, 특히 Windows에서는 바이너리 파일을 특별한 플래그로 열어야합니다. 이러한 이진 파일 을 처리하려면 모드 문자열에 문자 'b'와 함께 io.open을 사용해야합니다.

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