首页 > 解决方案 > 声明后如何访问 ProtoField 的名称?

问题描述

声明后如何访问 ProtoField 的 name 属性?

例如,类似于以下内容:

myproto = Proto("myproto", "我的原型")

myproto.fields.foo = ProtoField.int8("myproto.foo", "Foo", base.DEC)

打印(myproto.fields.foo.name)

我在哪里得到输出:

标签: reflectionluawiresharkprotofield

解决方案


另一种更简洁的方法:

local fieldString = tostring(field)
local i, j = string.find(fieldString, ": .* myproto")

print(string.sub(fieldString, i + 2, j - (1 + string.len("myproto")))

编辑:或者适用于任何协议的更简单的解决方案:

local fieldString = tostring(field)
local i, j = string.find(fieldString, ": .* ")

print(string.sub(fieldString, i + 2, j - 1))

当然,第二种方法只有在字段名称中没有空格的情况下才有效。由于情况不一定总是如此,因此第一种方法更稳健。这是包含在任何解析器都应该可用的函数中的第一个方法:

-- The field is the field whose name you want to print.
-- The proto is the name of the relevant protocol
function printFieldName(field, protoStr)

    local fieldString = tostring(field)
    local i, j = string.find(fieldString, ": .* " .. protoStr)

    print(string.sub(fieldString, i + 2, j - (1 + string.len(protoStr)))
end

...在这里它正在使用中:

printFieldName(myproto.fields.foo, "myproto")
printFieldName(someproto.fields.bar, "someproto")

推荐阅读