#lua #lua-table
Вопрос:
Я пытаюсь понять, что происходит в следующей функции, но у меня возникают проблемы с ее отслеживанием.
function whatsthis(str)
local val = ""
local vtable = "?29#sMb5rY41>hS05Bm~221162423xN19gRK\;p!02jJ_t4:-00vLiA]I=6l18ec24830w%7b151,0304Z)9`{*kP28F}ovn.[EfV06^01nC<U27WQamp;22(fTD26Guz/ aO'q3d|H25 ay$"X17200r@t"
for i = 1, #str do
local b = str:byte(i)
if b > 0 and b <= 127 then
val = val .. string.char(vtable:byte(b))
else
val = val .. string.char(b)
end
end
return val
end
Часть проблемы, я полагаю, в том, что мне дали это упражнение, и я даже не знаю, является ли vtable таблицей или строкой!
Пример вызова:
string1 = whatsthis(",5MX")
Я предполагаю,что str:byte(i) преобразует ascii в байты. т. Е.», 5MX» в 2c 35 4d 58, но я понятия не имею, как он ссылается на vtable или почему переменная, которая уже является байтом, должна быть повторно приведена в vtable:byte(b) снова. Ясно,что», 5MX» ссылается на vtable через промежуточный байт, но затем я теряюсь и понятия не имею, что возвращается в строку 1 или почему.
Что еще хуже….
string2 = whatsthis("f4kp,X26")
… этот параметр обрабатывается как одна строка или два значения, и как escapes обрабатываются в функции, если не как просто еще один символ.
Надеюсь, я выразился ясно. Я новичок в lua, поэтому надеюсь, что кто-нибудь сможет пролить здесь свет. Заранее спасибо.
Ответ №1:
Часть проблемы, я полагаю, в том, что мне дали это упражнение, и я даже не знаю, является ли vtable таблицей или строкой!
Вы назначаете что-то в двойных кавычках vtable, поэтому это должно быть строковое значение.
local vtable = "?29#sMb5rY..."
Видишь https://www.lua.org/manual/5.4/manual.html#3
str:byte(i)
является ли синтаксический сахар для string.byte(str, i)
Видишь https://www.lua.org/manual/5.4/manual.html#3.4.10
string.byte(str, i)
вернет внутренний цифровой код для номера символа i
в строке str
. Таким образом, он дает вам значение байта, представляющее этот символ.
Видишь https://www.lua.org/manual/5.4/manual.html#pdf-string.byte
Я предполагаю, что str:байт(i) преобразует ascii в байты. т. Е. «,5MX» в 2c 35 4d 58
ДА.
Этот код проверит, является ли символ частью стандарта ASCII. Если это так, он сопоставит его со строкой vtable.
Если он является частью расширенной таблицы ASCII, он будет использовать ее как есть
Сравнить с print(whatsthis("ö"))
print(whatsthis("a"))
Комментарии:
1. Отлично. Я поиграю с ним. Я уверен, что это поможет. По крайней мере, я чувствую, что теперь у меня есть направление. Спасибо.
Ответ №2:
Я даже не знаю, является ли vtable таблицей или строкой!
vtable-это всегда строка.
почему переменная, которая уже является байтом, должна быть повторно приведена в таблице vtable:byte(b) снова
Это потому, что он получает числовое значение символа, а затем находит символ в позиции с этим индексом. На первый взгляд кажется, что он реализует какой-то шифр подстановки, где он заменяет один символ определенным индексом (
Комментарии:
1. Хорошо, хорошо. Да, это определенно похоже на шифр. Просто манипулирование строками, чтобы лучше разобраться в незнакомом языке. Спасибо, приятель.