Проводник акула в Луа - userdata
Я новичок в Lua и создаю специальный диссектор для Wireshark. Моя ситуация такова:
Данные Wireshark состоят из шестнадцатеричных чисел, таких как 4321 8765 CBA9. То, что я хотел бы закончить, является (после того, как это было рассечено): CBA9 8765 4321.
До сих пор я создал небольшую функцию в Lua, которая будет принимать эти числа по отдельности, преобразовывать их в строки и размещать в правильном порядке.
function ReverseOrder3Numbers(hex_1, hex_2, hex_3)
local hex_1_int = hex_1:uint()
local hex_2_int = hex_2:uint()
local hex_3_int = hex_3:uint()
word1 = string.format("%04X", hex_1_int)
word2 = string.format("%04X", hex_2_int)
word3 = string.format("%04X", hex_3_int)
combined_string = "0x" .. word3 .. word2 .. word1
output = combined_string
return output
end
Однако, как только я иду, чтобы добавить эту связку в дерево, я получаю сообщение об ошибке Lua Error:...: вызов 'add' для плохого себя (ожидаемые данные пользователя, полученная строка).
Как я могу обойти это? Нужен ли мне совершенно другой подход? Я не ищу ничего сложного или причудливого. Все, что мне нужно сделать, это то, что я описал. Любая помощь будет оценена.
3 ответа
Там нет ничего плохого ReverseOrder3Numbers
(кроме, возможно, некоторых пропавших без вести local
классификаторы). Вы должны обновить свой вопрос, чтобы включить код, который вызывает add
,
Вы могли случайно использовать tree.add( ... )
вместо tree:add( ... )
(обратите внимание на двоеточие после tree
).
Вызов tree:add()
отправит объекту "дерево" прямую ссылку на само "дерево" в качестве первого неявного аргумента. И неважно, сколько аргументов вы приложите к этому звонку или вообще никому. использование tree.add()
Синтаксис, если ваш метод add не поддерживает самостоятельную ссылку. В этом случае "self" должно быть связано с объектом "tree" внутри метода "add".
Не понятно, что вы передаете в функцию ReverseOrder3Numbers
, Но так как вы получаете доступ к этим параметрам с помощью uint
метод я предполагаю, что параметры tvb:range(x,y)
Результаты. Если вы хотите изменить порядок цифр внутри отдельных значений, вы можете использовать методы с поддержкой порядка байтов:
function ReverseOrder3Numbers(hex_1, hex_2, hex_3)
local hex_1_int = hex_1:le_uint()
local hex_2_int = hex_2:le_uint()
local hex_3_int = hex_3:le_uint()
...
end
Если вы хотите изменить порядок байтов данных, добавляемых в дерево, вам следует использовать версию add
метод.
tree:le_add(f_MyProtoField, tvb:range(x,y), ReverseOrder3Numbers(...))
Я не знаю причину почему le
является суффиксом в одном случае и префиксом в другом.