0

我有一个程序可以检查某些变量字段的条件,例如

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 值,而不是正确检查相应的 if 条件。对于字段 == '2' 条件,该条件正确执行。
我该如何克服这种情况?我怎样才能使它适用于检查条件“0”和“1”?
先感谢您!
如果您想知道为什么我标记了 wireshark,if 检查条件是检查 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',它工作正常。

4

2 回答 2

1

正如 Corbin 所说,它绝对不会将“0”和“1”解释为 TRUE/FALSE。Wireshark 运行普通的 Lua 解释器,Lua 只将nil和 的布尔值false视为 false。当然,您并没有真正检查它们是否是错误值,而是将“wlan.fc.type”字段值的字符串化值与字符串“0”或字符串“1”进行字符串比较“ 管他呢。您为“wlan.fc.type”字段获得的实际值是一个数字,因此正如 Corbin 所说,没有必要将其转换为字符串并将其与字符串“0”或其他字符串进行比较......只是将它们作为数字进行比较。

无论如何,对它们进行字符串化也应该有效(只是效率较低),因此很可能在您的捕获中根本没有 wlan.fc.type 为 0 的 802.11 数据包。wlan.fc.type 0 是管理帧,1 是控制帧,2 是数据帧。因此,您可能只捕获 802.11 数据包,这就是您将字符串化 wlan.fc.type 与字符串“2”进行比较成功的原因。

找出答案的一种方法是在wireshark中打开您的捕获文件,并为“wlan.fc.type == 0”放入一个显示过滤器,看看是否显示了任何数据包。如果没有,那么您没有任何管理数据包。

于 2014-03-09T01:01:28.527 回答
1

手册

控制结构的条件表达式可以返回任何值。false 和 nil 都被认为是 false。所有不同于 nil 和 false 的值都被认为是 true(特别是数字 0 和空字符串也是 true)。

数字 0 和空字符串都评估为 true,因此绝对不会将字符串“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

然后您可以查看您收到的帧类型。

于 2013-06-19T20:22:11.113 回答