2012-05-11 4 views
0

Я пытаюсь преобразовать данные внутри пакета в int, но он не работает. Я могу правильно добавить поля в поддерево, но хотел бы иметь доступ к данным как целому числу для выполнения какой-либо другой работы.Как преобразовать данные из пакета в целое число в Wireshark с помощью Lua Dissector?

Я хочу, чтобы использовать переменную len ниже как int, но когда я пытаюсь использовать метод «tonumber», возвращается «Nil». Я могу преобразовать его в строку, используя «tostring», но не получим метод number.

Я видел некоторые примеры, которые используют следующий код для преобразования в целое число:

local len = buf(0,4):uint32() 

Но это производит следующее сообщение об ошибке, когда я запустить его на моей машине:

 Lua error: attempt to call method "uint32" (a nil value) 

Вот является код у меня есть, что делает все правильно, кроме тех, где прокомментировано:

{rest of code} 
-- myproto dissector function function 
function (my_proto.dissector (buf, pkt, root) 

    -- create subtree for myproto 
    subtree = root:add(my_proto, buf(0)) 
    -- add protocol fields to subtree 
    subtree:add(f_messageLength, buf(0,4)) 

    -- This line does not work as it returns a nil value 
    local len = tonumber(buf(0,4)) 

    -- This line produces a "bad argument #1 to 'set' (string expected, got nil) error" 
    -- add message len to info column 
    pkt.cols.info:set((tostring(len)))) 
    end 
end 
{rest of code} 

Итак, мой вопрос i s как преобразовать тип userdata в целое число, с которым я могу работать?

ответ

2

buf здесь TvbRange объект, и нет TvbRange.uint32(). Вы ищете TvbRange.uint(). Попробуйте это обновление:

function (my_proto.dissector (buf, pkt, root) 
    subtree = root:add(my_proto, buf(0)) 
    subtree:add(f_messageLength, buf(0,4)) 

    local len = buf(0,4):uint() 
    pkt.cols.info:set(len) 
end 
+0

Это отлично работает. Большое спасибо, это очень помогло мне. – Peter