String lua中的数组访问问题
我不确定这为什么不起作用:String lua中的数组访问问题,string,split,lua,lua-table,data-manipulation,String,Split,Lua,Lua Table,Data Manipulation,我不确定这为什么不起作用: -- split data into an array of chars dataList = string.gmatch(data, ".") -- edit char 5 DOES NOT WORK dataList[5] = 0x66 -- Print out the data in hex for chr in dataList do io.write(string.format("[%02x] ", string.byte(chr))) end 因
-- split data into an array of chars
dataList = string.gmatch(data, ".")
-- edit char 5 DOES NOT WORK
dataList[5] = 0x66
-- Print out the data in hex
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)) -- <---- this does not work :(
printStringAsHex("final", finalString)
end
然而,我正在努力将其转换回字符串,我得到了错误:
错误:main.lua:34:尝试调用字段“解包”一个空值堆栈
回溯:
main.lua:34:in函数“update”
[string boot.lua]:463:in函数
[C] :在函数“xpcall”中
如何实现这一点?您可能希望将字符串存储为表数组实际上是lua中的表: 更新 我不想写一个单独的答案,所以我在所有优秀答案/反馈的基础上为任何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)))
你有没有检查string.gmatch,特别是关于它返回什么的部分?@user2357112啊,好的,我确实看了文档,但是我没有看到返回类型。。。。那我怎么才能实现我想做的呢我一直盯着无数的例子,看不出是怎么回事;我不想做一些复杂的字符串替换的事情,我看到有人这样做。。。我怀念简单的C风格字符数组:在Lua5.1中,使用普通的unpackdataList而不是table.unpackdataList。unpack函数移到Lua5.2中的table模块中。@code\u fodder siffiejoe上面说的内容^。Love的引擎可能仍在Lua5.1上。@code\u fodder您还可以将一个本地unpack=unpack或table.unpack放在某个地方,稍后使用unpackdataList@code_fodder没问题。我进一步修改了它,以减少不必要的检查等。。。我不认为你在评论中写的是实际的工作代码,即localunpack=unpack或table.unpack我认为那是伪代码,太酷了!
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)))