2013-06-19 7 views
0

У меня есть программа, которая проверяет условия некоторой переменной поля, какLua проверка misinterpreying состояние

if(tostring(field) == '0') then {do something} 
if(tostring(field) == '1') then {do something} 
if(tostring(field) == '2') then {do something} 

Но, я думаю, что Lua интерпретирует «0» и «1», как TRUE/FALSE значения и не проверяя Соответственно, если условия должным образом. Условие корректно выполняется для условия field == '2'.
Как я могу преодолеть этот случай? Как я могу заставить его работать для условий проверки «0» и «1»?
Благодарю вас заранее!
В случае, если вам интересно, почему я помечен wirehark, условие проверки проверяет поле в файле pcap.
Мой Lua код ссылки выглядит следующим образом:

#!/usr/bin/lua 

do 
    local pkts = 0 
    local stat = {} 
    local file = io.open("luawrite","w") 
    local function init_listener() 
      local tap = Listener.new("wlan") 
      local src_addr = Field.new("wlan.sa") 
      local type = Field.new("wlan.fc.type") 
      local sub_type = Field.new("wlan.fc.subtype") 
      local frame_length = Field.new("frame.len") 
      local data_rate = Field.new("wlan.data_rate") 
      function tap.reset() 
        pkts = 0; 
      end 

      function tap.packet(pinfo, tvb) 
        local client = src_addr() 
        local stype = sub_type() 
        local ty = type() 
        local ts = tostring(pinfo.rel_ts) 
        local fl = frame_length() 
        rate = data_rate() 
        if(tostring(ty) == '0') then 
          file:write(tostring(ts), "\t", tostring(fl), "\t", tostring(rate), "\n") 
        end 
      end 
    end 
    init_listener() 
end 

условие я имею в виду 7-й линии от последней строки. Если я даю условие tostring (ty) == '2', он работает правильно.

+0

Что такое вывод 'file: write (_G.type (ty), '\ t', tostring (ty)) 'в wirehark? –

+0

Проверка работоспособности: вы подтвердили, что тип оценивается чем-то иным, чем 2? Возможно, ваш пакетный захват содержит только тип 2. – user46874

ответ

0

От manual:

Условие выражение структуры управления может возвращать любое значение. И ложь, и ноль считаются ложными. Все значения, отличные от nil и false, считаются истинными (в частности, пустые строки и 0 ).

Оба числа 0 и пустая строка оцениваются как истинные, поэтому он определенно не принимает строку «0» для false. Я мог бы избежать переопределения type. Кроме того, я думаю, frame_type возвращает число, чтобы вы могли избавиться от tostring() в состоянии.

do 
    local pkts = 0 
    local stat = {} 
    local file = io.open("luawrite","w") 

    local function init_listener() 
     local tap = Listener.new("wlan") 
     local src_addr = Field.new("wlan.sa") 
     -- Changed function from type to frame_type 
     local frame_type = Field.new("wlan.fc.type") 
     local sub_type = Field.new("wlan.fc.subtype") 
     local frame_length = Field.new("frame.len") 
     local data_rate = Field.new("wlan.data_rate") 
     function tap.reset() 
      pkts = 0; 
     end 

     function tap.packet(pinfo, tvb) 
      local client = src_addr() 
      local stype = sub_type() 
      local ty = frame_type() 
      local ts = tostring(pinfo.rel_ts) 
      local fl = frame_length() 
      rate = data_rate() 
      -- skip the tostring 
      if ty == 0 then 
       file:write(tostring(ts), "\t", tostring(fl), "\t", tostring(rate), "\n") 
      end 
     end 
    end 
    init_listener() 
end 

Если все остальное терпит неудачу, попробуйте написать строку независимо от типа кадра и писать тип кадра с ним:

function tap.packet(pinfo, tvb) 
    local client = src_addr() 
    local stype = sub_type() 
    local ty = frame_type() 
    local ts = tostring(pinfo.rel_ts) 
    local fl = frame_length() 
    rate = data_rate()    
    file:write(tostring(ty), "\t", tostring(ts), "\t", tostring(rate), "\n") 
end 

Затем вы можете увидеть, какие типы кадров вы получаете.

+0

Я попытался. тоже не работает. –

0

Как сказал Корбин, это определенно не интерпретирует «0» и «1» как TRUE/FALSE. Wireshark управляет переводчиком Lua, и Lua рассматривает только nil и логическое значение false как ложное значения. Конечно, вы на самом деле не проверяете, являются ли они ложными значениями, вы выполняете сравнение строк значения строки «значение wlan.fc.type» в строке «0» или строку «1 »или что угодно. Фактическое значение, которое вы получаете для поля «wlan.fc.type», является числом, так как Корбин сказал, что нет необходимости преобразовывать его в строку и строку - сравнить его с строкой «0» или что-то еще ... просто сравнивайте их как числа.

Независимо от того, что их оба из них должны были работать (просто были менее эффективными), поэтому шансы на то, что просто нет пакета 802.11 с wlan.fc.type 0 в вашем захвате. WLAN.fc.type 0 - это кадр управления, 1 - это управляющий кадр, а 2 - это кадр данных. Таким образом, вероятность заключается в том, что вы только собираете пакеты данных 802.11, поэтому ваше сравнение string-ified wlan.fc.type с строкой «2» преуспевает.

Один из способов узнать, как открыть файл захвата в wirehark и поместить в фильтр отображения для «wlan.fc.type == 0» и посмотреть, показаны ли какие-либо пакеты. Если нет, то у вас нет пакетов управления.

Смежные вопросы