2013-10-31 64 views
3

我在向Lua中的二進制文件寫入字符串時遇到問題。有一個現有的例子,我試着修改它。請看:在Lua中將字符串寫入二進制文件

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

(語義點)Lua字符串是二進制的:它們是不可變的,計數的字節序列。沒有假設也沒有要求它們是來自任何字符集的字符的一種或任何編碼。當然,函數可以以其他方式處理它們。 –

回答

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

是錯誤的,它應該是:

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

謝謝。我發現代碼工作得很好。現在我的問題變得更大了。你知道我如何在C++中聲明無符號__int32,無符號__int16和無符號__int8嗎? – xacrilege

+1

@xacrilege Lua只有一個'number'類型,默認情況下它與C++中的'double'相同。沒有內置的整數類型,你不需要聲明變量。 –

+2

@xacrilege,見http://www.inf.puc-rio.br/~roberto/struct/和http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/#lpack。 – lhf