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 条件を適切にチェックしていないと思います。条件は、field == '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行目を参照している条件。条件をstring(ty) == '2'にすると正常に動作します。

4

2 に答える 2

1

コービンが言ったように、それは間違いなく「0」と「1」をTRUE/FALSEとして解釈していません。Wireshark は標準の Lua インタープリターを実行し、Lua はnilと のブール値のみfalseを falseと見なします。もちろん、それらが偽の値であるかどうかを実際にチェックしているわけではありません。「wlan.fc.type」フィールド値の文字列化された値と文字列「0」または文字列「1」との文字列比較を行っています。 」または何でも。「wlan.fc.type」フィールドで取得する実際の値は数値であるため、コービンが言ったように、それを文字列に変換して文字列を「0」などの文字列と比較する必要はありません...数値として比較します。

とにかく、両方の文字列化も機能するはずです (効率が悪いだけです)。そのため、wlan.fc.type が 0 の 802.11 パケットがキャプチャに含まれていない可能性があります。wlan.fc.type 0 は管理フレーム、1 は制御フレーム、2 はデータ フレームです。そのため、文字列化された wlan.fc.type と文字列「2」の比較が成功するのは、802.11 データ パケットのみをキャプチャしている可能性が高いためです。

これを確認する 1 つの方法は、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 に答える