【问题标题】:How to handle bit fields in Wireshark Lua dissector?如何处理 Wireshark Lua 解析器中的位域?
【发布时间】:2018-07-10 22:26:35
【问题描述】:

我需要在 Wireshark lua 解析器中解析位映射的八位字节。八位字节的格式为:

bit 0:     Concatenation (0=No concatenation, 1=Concatenation)
bits 1..3: Reserved
bits 4..7: Version

我已经成功剖析了它:

Concatenation_F = ProtoField.uint8("Concatenation", "Concatenation", base.DEC, NULL, 0x1)
Version_F = ProtoField.uint8("Version", "Version", base.DEC, NULL, 0xF0)

my_protocol.fields = { Concatenation_F,
                   Version_F
}

<snip>

local Concatenation_range = buffer(0,1)
local Version_range = buffer(0,1)

local Concatenation = Concatenation_F:uint()
local Version = Version_range:uint()

subtree:add(Concatenation_F, Concatenation_range, Concatenation)
subtree:add(Version_F, Version_range, Version)

这行得通,但我想说明 Concatenation 字段的含义,例如:

但要做到这一点,我需要获取 Concatenation 位的值。我该怎么做?

【问题讨论】:

    标签: lua wireshark wireshark-dissector


    【解决方案1】:

    有两种解决方案。通常你只需引入一个 valuestring 并在你的 ProtoField 调用中使用它。例如:

    local yesno_types = {
        [0] = "No",
        [1] = "Yes"
    }
    
    Concatenation_F = ProtoField.uint8("Concatenation", "Concatenation", base.DEC, yesno_types, 0x1)
    

    请参阅第 11.6.7 节。 Wireshark Developer's Guide 的 ProtoField 了解更多信息。

    但是,如果您仍然想获取位域的值,那么您可以使用 Lua BitOp 支持来实现,该支持已经可供您使用。所以,是这样的:

    local function get_concat(x) return bit.band(x, 0x01) end
    
    local concat = get_concat(buffer(0, 1):uint())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多