2016-08-15 2 views
1

Я не знаю, почему это не работает:Проблема с доступом массива в Lua

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

Однако я изо всех сил, чтобы превратить это обратно в строку, я получаю ошибку:

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'

как я могу добиться этого?

+1

Вы проверили [документы] (https://docs.coronalabs.com/api/library/string/gmatch.html) для 'string.gmatch', в частности часть о том, что она возвращает? – user2357112

+0

@ user2357112 ах, ок я смотрел документы, но я пропустил тип возврата .... как, черт возьми, я достигаю того, что я хочу сделать тогда? - Я смотрел на бесконечные примеры, не вижу, как; Я не хочу делать сложную строковую замену (я вижу, что люди это делают ... Я пропускаю простые массивы символов C-стиля: ( –

ответ

3

Вы хотите, возможно, хранить строку в виде таблицы (массивы фактически table s в Lua):

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

Спасибо за это, кажется, имеет смысл ... только я получаю сообщение об ошибке когда я перехожу к этому: 'Ошибка: main.lua: 30: попытка вызвать upvalue 'data' (строковое значение)'. Ошибка для первой строки. Я попробую сделать это как отдельный бит кода. получение 'data' в качестве возвращаемого значения из пакета udp, я предполагаю, что это строка - он говорит, что это ... –

+0

@code_fodder damn !, который должен был быть' data: byte() '. Исправлено сейчас! – hjpotter92

+0

О да, это сработало сейчас :)) ... Я не думаю, что вы можете показать мне, как вернуть таблицу в строку (например, после того, как я закончил редактирование содержимого) ... Я не могу сказать, Мне нужно использовать concat или unpack() - у меня было несколько файлов с распаковкой, но я думаю, что он создает список/таблицу? ... –

Смежные вопросы