2013-10-31 41 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