Проводник акула в Луа - 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 является суффиксом в одном случае и префиксом в другом.

Другие вопросы по тегам