如何处理 Wireshark Lua 解剖器中的位字段?

Dav*_*idA 5 lua wireshark wireshark-dissector

我需要在 Wireshark lua 解剖器中解剖一个位映射的八位字节。八位字节具有格式:

bit 0:     Concatenation (0=No concatenation, 1=Concatenation)
bits 1..3: Reserved
bits 4..7: Version
Run Code Online (Sandbox Code Playgroud)

我已经成功地剖析了它:

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)
Run Code Online (Sandbox Code Playgroud)

那行得通,但我想展示 Concatenation 字段的含义,例如:

在此处输入图片说明

但要做到这一点,我需要获得 Concatenation 位的值。我怎样才能做到这一点?

Chr*_*ard 5

有2种解决方案。通常,您只需引入一个值字符串并在ProtoField调用中使用它。例如:

local yesno_types = {
    [0] = "No",
    [1] = "Yes"
}

Concatenation_F = ProtoField.uint8("Concatenation", "Concatenation", base.DEC, yesno_types, 0x1)
Run Code Online (Sandbox Code Playgroud)

请参阅第 11.6.7 节。有关详细信息,请参阅Wireshark 开发人员指南ProtoField 。

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

local function get_concat(x) return bit.band(x, 0x01) end

local concat = get_concat(buffer(0, 1):uint())
Run Code Online (Sandbox Code Playgroud)