lua wireshark解析器: Protofield规范

我在LUA中有这个协议字段描述符:

local atcs_hdr = {
   region = Protofield.uint16("atcs.rrp.region","地区",base.HEX)
}

它生成了这个树形项目:

地区: 0x9AA1

我真正需要的是一个将这个十六进制值转换为“6817.1”的函数的字符串表示:

地区: 6817.1

我有一个本地函数可以进行此转换:

local function HexToRegion(val)
    -- 输入: 0xA70F
    -- 输出: 9999.1
    local region = bit.band(val,0x7FFF)
    local dir = 0
    if (bit.band(val,0x8000) == 0x8000) then
        dir = 1
    end
    return string.format("%d.%d",region,dir)
end

但我该如何将其链接到Protofield规范中?

编辑:解析器在这里将“region”添加到树中:

local region_tvbr = tvbuf:range(0,2)
tree:add("atcs.rrp.region",region_tvbr )
-- 地区: 0x9AA1

通过添加字符串函数,我几乎可以得到我想要的结果:

local region_tvbr = tvbuf:range(0,2)
local region_val = region_tvbr:uint()
local subtree = tree:add("atcs.rrp.region",region_tvbr)
subtree:append_text("("..HexToRegion(region_val)..")")
-- 地区: 0x9AA1 (6817.1)

但这不是我想要的。

点赞
用户2755698
用户2755698

我认为你应该使用 set_text 来实现你想要的功能。例如:

local region_item = tree:add(atcs_hdr.region, tvbuf:range(0, 2))
region_item:set_text("Region: " .. HexToRegion(tvbuf:range(0, 2):uint()))

详见 Wireshark 开发人员指南的 第 11.7 节。向解析树添加信息 或 Wireshark LuaAPI/TreeItem 维基页面。

2019-12-25 18:20:51