2013-10-31 5 views
3

루아에서 이진수로 문자열을 쓰는 데 문제가 있습니다. 기존 예제가 있으며 수정하려고했습니다. 보세요 :루아에서 이진수로 문자열 쓰기

function StringToBinary() 
    local file = io.open("file.bin", "wb") 
    local t = {} 
    local u = {} 
    local str = "Hello World" 
    file:write("string len = " ..#str ..'\n') 
    math.randomseed(os.time()) 
    for i=1, #str do 
    t[i] = string.byte(str[i]) 
    file:write(t[i].." "); 
    end 
    file:write("\n") 
    for i=1, #str do 
    u[i] = math.random(0,255) 
    file:write(u[i].." "); 
    end 
    file:write("\n"..string.char(unpack(t))) 
    file:write("\n"..string.char(unpack(u))) 
    file:close() 
end 

file:write(t[i].." ")file:write(u[i].." ")는 정수 값으로 두 테이블을 작성합니다. 그러나 내 마지막 두 글과 함께 : unpack(t)은 원래 텍스트를 표시하고 unpack(u)은 바이너리를 표시합니다.

실수로 생각하면 string.byte(str[i]) 일 것입니다. 무엇으로 대체해야합니까? 내가 놓친 게 있니?

+0

문제는 컴파일이 아닌 다른 있습니까? 당신의 질문은 어디에 있습니까? –

+0

아래에서 언급 한 것처럼이 코드가 잘 작동하면 (컴파일 문제 제외) 질문을 이렇게 수정하십시오. 귀하의 질문은 어떤 종류의 문제인지 명확하지 않았으며, 사람들은 그것이 잘못되었다고 혼동되어 여전히 풀어야 할 필요가 있습니다. –

+0

(Semantic point) 루아 문자열은 바이너리입니다 : 그것은 불변의 카운트 된 바이트 시퀀스입니다. 문자 세트의 문자를 하나 또는 모든 문자로 인코딩한다는 가정이나 요구 사항은 없습니다. 기능은 물론, 그들을 다르게 취급 할 수 있습니다. –

답변

4
t[i] = string.byte(str[i]) 

잘못, 그것은해야한다 :

t[i] = string.byte(str, i) 
+1

감사합니다. 나는 코드가 잘 작동한다는 것을 알았다. 이제 내 문제가 커졌습니다. C++에서 서명되지 않은 __int32, 서명되지 않은 __int16 및 서명되지 않은 __int8을 어떻게 선언하는지 알고 있습니까? – xacrilege

+1

@xacrilege 루아는 단 하나의'number' 타입을 가지고 있습니다. 이것은 기본적으로 C++에서'double'과 동일합니다. 기본 제공 정수 유형이 없으므로 변수를 선언 할 필요가 없습니다. –

+2

@ xacrilege, http://www.inf.puc-rio.br/~roberto/struct/ 및 http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/#lpack을 참조하십시오. – lhf