Проводник акула в Луа - userdata - PullRequest
1 голос
/ 31 октября 2011

Я новичок в 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 ]

3 голосов
/ 02 ноября 2011

Нет ничего действительно плохого в ReverseOrder3Numbers (кроме, возможно, некоторых пропущенных local квалификаторов). Вы должны обновить свой вопрос, чтобы включить код, который вызывает add.

Возможно, вы случайно использовали tree.add( ... ) вместо tree:add( ... ) (обратите внимание на двоеточие после tree).

0 голосов
/ 28 ноября 2016

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

0 голосов
/ 04 ноября 2011

Вызов tree:add() отправит объекту "дерево" прямую ссылку на само "дерево" в качестве первого неявного аргумента. И неважно, сколько аргументов вы приложите к этому звонку или вообще никому. Используйте синтаксис tree.add(), если ваш метод add не поддерживает самостоятельную ссылку. В этом случае «self» должно быть связано с объектом «tree» внутри метода «add».

...