11.2.1.Field
一个字段提取器(Field extractor),用来获取字段值。一个字段对象能且只能在 dissectors、post-dissectors、heuristic-dissectors和taps 的回调函数之外创建;
一旦创建,它就可以在回调函数中使用,以生成一个 FieldInfo 对象;
11.2.1.1.Field.new(fieldname)
创建一个字段提取器;
-
参数
-
fieldname
所创建的字段过滤器(field filter)的名称(例如,ip.addr)
-
-
返回值
- 一个字段提取器;
-
可能出现的错误
- A Field extractor must be defined before Taps or Dissectors get called
11.2.1.2.Field.list()
用于获取一个包含所有已注册字段过滤器名称的Lua数组表(Lua array table);
PS:该操作开销十分巨大,应仅在错误排查时使用;
-
返回值
- 一个包含所有字段过滤器名称的数组表;
11.2.1.3.field:__call()
获取调用该方法的字段的所有值(详见FieldInfo);
-
返回值
- 该field中的所有值;
-
可能出现的错误
- Fields cannot be used outside dissectors or taps
11.2.1.4.field:__tostring()
获取一个带有字段过滤器名称的字符串;
11.2.1.5.field.name
模式:仅用于检索(Mode:Retrieve only);
该字段过滤器的名称,不存在则为空;
11.2.1.6.field.display
模式:仅用于检索(Mode:Retrieve only);
该字段的完整显示名称,不存在则为空;
11.2.1.7.field.type
模式:仅用于检索(Mode:Retrieve only);
该字段的ftype,不存在则为空;
11.2.2.FieldInfo
一个从已解析的数据包中提取的字段;
FieldInfo 对象只能在dissectors、post-dissectors、heuristic-dissectors和taps的回调函数中使用;
FieldInfo 可以通过事先使用 Field.new() 或 Field() 在现有的Wireshark 字段上调用,也可以通过Lua从 ProtoField 创建的新字段上调用;
11.2.2.1.fieldinfo:__len()
获取该字段的长度;
11.2.2.2.fieldinfo:__unm()
获取该字段的偏移量;
11.2.2.3.fieldinfo:__call()
获取该字段的值;
在1.11.4版本之前,这个函数就用于为绝大部分的字段类型来检索值,但是对于 ftypes.UINT_BYTES 这一类型,它检索的是整个字段的报文数据可用范围(Tvbrange)的字节数组(ByteArray)。换句话说,它返回的ByteArray包括了前导字节(leading length byte(s) )的长度,而不是仅仅包含值的字节。那是一个Bug,在1.11.4版本中已被修复。此外,对于 ftupes.GUID 这种类型也是同样的情况;
如果你仍然希望得到一个 TvbRange 的 ByteArray ,请使用 FieldInfo:get_range() 来获取,然后使用 Tvb:bytes() 将其转换为 Bytearray;
11.2.2.4.fieldinfo:__tostring()
该字段的一个字符串表示;
11.2.2.5.fieldinfo:__eq()
检查等式左值(lhs)是否在等式右值(rhs)之内;
11.2.2.6.fieldinfo:__le()
检查等式左值(lhs)的结束字节是否在等式右值(rhs)的结束字节之前;
-
可能出现的错误
- Data source must be the same for both fields
11.2.2.7.fieldinfo::__lt()
检查等式右值(rhs)的结束字节是否在等式右值(rhs)的起始字节之前;
-
可能出现的错误
- Data source must be the same for both fields
11.2.2.8.fieldinfo.len
模式:仅用于检索(Mode: Retrieve only);
该字段的长度;
11.2.2.9.fieldinfo.offset
模式:仅用于检索(Mode: Retrieve only);
该字段的偏移量;
11.2.2.10.fieldinfo.value
模式:仅用于检索(Mode: Retrieve only);
该字段的值;
11.2.2.11.fieldinfo.label
模式:仅用于检索(Mode: Retrieve only);
一个代表该字段的字符串;
11.2.2.12.fieldinfo.display
模式:仅用于检索(Mode: Retrieve only);
一个字符串,含义是该字段将在GUI中以什么名称展示;
11.2.2.13.fieldinfo.type
模式:仅用于检索(Mode: Retrieve only);
内部字段类型,一个与 init.lua 中的 ftype 值匹配的数字;
11.2.2.14.fieldinfo.source
模式:仅用于检索(Mode: Retrieve only);
Fieldinfo 的源报文数据(Tvb)对象,不存在则为空;
11.2.2.15.fieldinfo.range
模式:仅用于检索(Mode: Retrieve only);
TvbRange ,即 Tvb 中该field覆盖的字节数,不存在则为空;
11.2.2.16.fieldinfo.generated
模式:仅用于检索(Mode: Retrieve only);
该字段是否被标记为已生成(布尔型);
11.2.2.17.fieldinfo.hidden
模式:仅用于检索(Mode: Retrieve only);
该字段是否被标记为隐藏(布尔型);
11.2.2.18.fieldinfo.is_url
模式:仅用于检索(Mode: Retrieve only);
该字段是否被标记为一个URL(布尔型);
11.2.2.19.fieldinfo.little_endian
模式:仅用于检索(Mode: Retrieve only);
该字段是否为小数位编码(little-endian encoded)(布尔型);
11.2.2.20.fieldinfo.big_endian
模式:仅用于检索(Mode: Retrieve only);
该字段是否为大数位编码(big-endian encoded)(布尔型);
11.2.2.21.fieldinfo.name
模式:仅用于检索(Mode: Retrieve only);
该字段的过滤器名称;
11.2.3.Global Functions
11.2.3.1.all_field_infos()
获取当前协议树(current tree)上的所有字段。请注意,这个函数只获取底层解析器(underlyting dissectors)为这个数据包(packet)所填充的字段——或许还有一些适用于这个数据包的字段没有被填充(至协议树),因为在此时此刻它们并没有被需要(not needed for anything)。这个函数只获得C端(C-side)代码当前填充的内容,而不是完整的列表。
-
可能出现的错误
- Cannot be called outside a listener or dissector