"tvb(偏移):字符串()"的含义是什么?

这几天,我在学习如何使用Lua编写WireShark插件。但是我不知道tvb(offset):string的含义。为什么使用tostring(tvb(offset))是错误的呢?谢谢你的回答

function weibo.dissector(tvb, pinfo, tree)
    local proto_type = tvb(23, 1):uint();
    if(proto_type ~= 0x06) then
        return
    end

    local offset = get_payload_offset(tvb, proto_type)
    local data = tvb(offset):string();
    local i, j = string.find(data, "weibo")
    if(i) then
        pinfo.cols.protocol = weibo.name
        local subtree = tree:add(weibo, tvb(offset+i-1))
        subtree:append_text(", ptn_pos: " .. i .. "-" .. j)
    end
end
点赞
用户2858170
用户2858170

tvb 是一个 Testy Virtual Buffer(测试虚拟缓冲器)。

Tvb ("测试虚拟缓冲器")代表数据包的缓冲区。它作为参数传递给监听器和解剖器,并可用于从数据包中提取信息(通过 TvbRange)。请注意,Tvbs 仅可由当前侦听器或解析器调用,并且在侦听器/解析器返回后立即销毁,因此对它们的引用在函数返回后无法使用。

调用 tvb(offset) 会返回一个 TvbRange

TvbRange 是 Tvb 中用于提取数据的一系列字节。TvbRange 是通过 tvb:__call()tvb:range([offset] [,length]) 创建的。

备注: tvb 是一个 Lua 表。如果像 tvb() 这样调用,将调用 __call() 元方法

https://wiki.wireshark.org/LuaAPI/Tvb#tvb:__call.28.29

tvb:__call()

描述

从此 Tvb 的子集创建 TvbRange。与 tvb:range() 相同。不能直接调用。

返回值

userdata:新的 TvbRange。

TvbRange 的众多方法之一是 tvbrange:string()

tvbrange:string()

描述

从 TvbRange 中获取一个字符串。

返回值

字符串:包含 TvbRange 中的所有字节,包括所有零(例如,“a\000bc\000”)的字符串。

另一方面,tostring() 是 Lua 的标准函数之一。

来自 https://www.lua.org/manual/5.3/manual.html#pdf-tostring

接收任何类型的值并将其转换为人类可读的字符串格式。 (要完全控制数字的转换方式,请使用 string.format。)如果 v 的 metatable 具有 __tostring 字段,则 tostring 调用相应的值并使用调用结果作为其结果的 v 参数。

由于 tvb 实现了 __tostring()tostring(tvb) 将返回该元方法的返回值。

tvb:__tostring()

描述

获取 Tvb 的字符串表示形式。不能直接调用。

返回值

string:Tvb 的字符串表示形式。

2019-04-04 14:54:28