Lua中关于数组访问的问题

我不确定为什么下面的代码无法正常工作:

-- 将数据分割成字符数组
dataList = string.gmatch(data, ".")

-- 修改第5个字符,但是不起作用
dataList[5] = 0x66

-- 以十六进制打印数据
for chr in dataList do
  io.write(string.format("[%02x] ", string.byte(chr)))
end

所以如果我注释掉 dataList[5] = 0x66 这一行,那么代码就可以正常工作了。所以我不明白为什么我不能修改第5个元素。我得到的错误信息更加让我困惑:

Error: main.lua:33: attempt to index global 'dataList' (a function value)
stack traceback:
        main.lua:33: in function 'update'
        [string "boot.lua"]:463: in function <[string "boot.lua"]:435>
        [C]: in function 'xpcall'

这是什么意思?- 我应该怎么做?

实际上,我只想修改字符串的特定字符- 但是在Lua中人们说你不能这么做,因为字符串是不可变的。所以我的想法是将字符串拆分为数组,然后在完成后将其转换回字符串...

更新

感谢hjpotter92的帮助,我现在有以下代码:

dataList = {data:byte(1, data:len())}
dataList[5] = 0x66
if dataList then
  finalString = string.char(table.unpack(dataList))     -- <---- 这个不起作用 :(
  printStringAsHex("final", finalString)
end

但是,我无法将其转换回字符串,我得到了以下错误:

Error: main.lua:34: attempt to call field 'unpack' (a nil value) stack traceback: main.lua:34: in function 'update' [string "boot.lua"]:463: in function <[string "boot.lua"]:435> [C]: in function 'xpcall'

我该怎么办?

点赞
用户1190388
用户1190388

你也许想将字符串存储为一个表(在lua中,数组实际上就是table):

dataList = {data:byte(1, data:len())}
dataList[5] = 0x66

print( string.char(table.unpack(dataList)) )

更新

我不想写一个单独的答案,所以我添加了一个完整的工作示例,适用于任何Lua版本,基于所有伟大的答案/反馈。这只是为了参考,以防其他人遇到类似的问题...

unpack = unpack or table.unpack

data = string.char(0x42, 0x42, 0x43, 0x15, 0x034, 0x33, 0x48)
dataList = {data:byte(1, data:len())}
dataList[5] = 0x66
print(string.char(unpack(dataList)))
2016-08-15 17:24:52