Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String lua中的数组访问问题_String_Split_Lua_Lua Table_Data Manipulation - Fatal编程技术网

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)))