11.8.1. ByteArray
11.8.1.1. ByteArray.new([hexbytes], [separator])
新建一个 ByteArray 对象;
从1.11.3版本开始,如果第二个参数是一个布尔值 "true",那么第一个参数就被当作一个原始的Lua字节字符串来使用,而不是一个十六进制的字符串;
11.8.1.2. 示例
local empty = ByteArray.new()
local b1 = ByteArray.new("a1 b2 c3 d4")
local b2 = ByteArray.new("112233")
-
参数
-
hexbytes (可选)
一个由十六进制字节组成的字符串,如 "00 B1 A2 "或 "1a2b3c4d";
-
separator (可选)
十六进制字节/字之间的字符串分隔符(默认=" "),如果使用布尔值true,则第一个参数被视为原始二进制数据;
-
-
返回值
- 一个新的 ByteArray 对象;
11.8.1.3. bytearray:__concat(first, second)
连接两个 ByteArray 对象;
-
参数
-
first
第一个数组;
-
second
第二个数组;
-
-
返回值
- 一个新的,连接后的 ByteArray ;
11.8.1.4. bytearray:__eq(first, second)
比较两个 ByteArray 的值;
-
参数
-
first
第一个数组;
-
second
第二个数组;
-
11.8.1.5. bytearray:prepend(prepended)
在该 ByteArray 的前部添加一个 ByteArray ;
-
参数
-
prepended
需要被添加到前面的 ByteArray;
-
11.8.1.6. bytearray:append(appended)
向该 ByteArray 添加一个 ByteArray ;
-
参数
-
appended
需要添加的 ByteArray ;
-
11.8.1.7. bytearray:set_size(size)
设置ByteArray的大小,如果比之前的小,则截断它,如果比之前的大,则用零填充它;
-
参数
-
size
该数组的新大小;
-
-
可能出现的错误
- ByteArray size must be non-negative
11.8.1.8. bytearray:set_index(index, value)
设置一个ByteArray 的索引值;
-
参数
-
index
要设置的字节的位置;
-
value
要设置的字符值[0-255];
-
11.8.1.9. bytearray:get_index(index)
获取一个ByteArray 的索引值;
-
参数
-
index
要获取的字节的位置;
-
-
返回值
- 该字节的[0-255]的值;
11.8.1.10. bytearray:len()
获取一个 ByteArray 的长度;
-
返回值
- 该 ByteArray 的长度;
11.8.1.11. bytearray:subset(offset, length)
获取 ByteArray 的一段,生成一个新的 ByteArray ;
-
参数
-
offset
起始字节的位置 (索引从0开始).
-
length
要获取的长度;
-
-
返回值
- 一个符合要求的新 ByteArray ;
11.8.1.12. bytearray:base64_decode()
获取一个 Base64 解码的 ByteArray ;
-
返回值
- 创建的 ByteArray ;
11.8.1.13. bytearray:raw([offset], [length])
以 Lua 字符串的形式获取到一个 ByteArray 中的二进制字节;
-
参数
-
offset (可选)
The position of the first byte (default=0/first).
-
length (可选)
The length of the segment to get (default=all).
-
-
返回值
- 该 ByteArray 中的二进制字节的Lua字符串;
11.8.1.14. bytearray:tohex([lowercase], [separator])
给定分隔符,以十六进制 ASCII 码(hex-ascii)的形式获取到 ByteArray 中的字节的Lua 字符串;
-
参数
-
lowercase (可选)
为
True
则使用小写十六进制字符 (默认为False
). -
separator (可选)
需要插入十六进制字节之间的字符串分隔符 (默认为
nil
).
-
-
返回值
- 一个 ByteArray 的hex-ascii字符串表示;
11.8.1.15. bytearray:__tostring()
获得一个包含 ByteArray 中的字节的Lua字符串,以便在显示过滤器中使用。(e.g. "01FE456789AB").
-
返回值
- 一个 ByteArray 的hex-ascii字符串表示;
11.8.1.16. bytearray:tvb(name)
从一个 ByteArray 创建一个新的 Tvb,该 Tvb 将被添加到当前帧中;
11.8.1.17. 示例
function proto_foo.dissector(buf, pinfo, tree)
-- Create a new tab named "My Tvb" and add some data to it
local b = ByteArray.new("11223344")
local tvb = ByteArray.tvb(b, "My Tvb")
-- Create a tree item that, when clicked, automatically shows the tab we just created
tree:add( tvb(1,2), "Foo" )
end
-
参数
-
name
赋予新数据源的名称;
-
-
返回值
- 一个新建的 Tvb;
11.8.2. Tvb
一个 Tvb 代表了数据包的缓冲区。它被作为参数传递给监听器(listener)和解析器(dissector),可以用来从数据包的数据中提取信息(通过TvbRange)。
要创建一个 TvbRange,必须以 offset 和 length 作为可选的参数来调用 Tvb;offset默认为0,length默认为tvb:capted_len() ;
警告 |
---|
Tvbs 只能被当前的监听器或解析器调用,并且在监听器或解析器返回时被销毁,所以一旦方法返回,对它们的引用就无法使用; |
11.8.2.1. tvb:__tostring()
将 Tvb 的字节转化为字符串;
这主要是为了调试的目的,因为如果字符串太长,就会被截断;
-
返回值
- 字符串;
11.8.2.2. tvb:reported_len()
获取一个Tvb的报告长度(网络上的长度);
-
返回值
- 该 Tvb 的报告长度;
11.8.2.3. tvb:captured_len()
获取 Tvb 的捕获长度(捕获过程中保存的数量)。
-
返回值
- 该 Tvb 的捕获长度;
11.8.2.4. tvb:len()
获取一个 Tvb 的捕获长度(在捕获过程中保存的数量)。与capture_len相同,只是为了向后兼容而保留。
-
返回值
- 该 Tvb 的捕获长度;
11.8.2.5. tvb:reported_length_remaining()
获得报告的(不是捕获的)到 Tvb 结尾的数据包的长度,如果偏移量超过 Tvb 结尾,则为0。
-
返回值
- 该 Tvb 的捕获长度;
11.8.2.6. tvb:bytes([offset], [length])
从一个 Tvb 获得一个 ByteArray ;
-
参数
-
offset (可选)
从 Tvb 起始处的偏移量(以
8-bit
为单位),默认为0; -
length (可选)
范围的长度(以
8-bit
为单位),默认为到 Tvb 结束为止;
-
-
返回值
- 一个 ByteArray 对象或为
nil
;
- 一个 ByteArray 对象或为
11.8.2.7. tvb:offset()
返回子 Tvb 的原始偏移量(从源 Tvb 的开始);
-
返回值
- 该 Tvb 的原始偏移量;
11.8.2.8. tvb:__call()
等同于 tvb:range(…) ;
11.8.2.9. tvb:range([offset], [length])
从这个 Tvb 中创建一个 TvbRange;
-
参数
-
offset (可选)
从 Tvb 起始处的偏移量(以
8-bit
为单位),默认为0; -
length (可选)
范围的长度(以
8-bit
为单位),默认为-1,指定Tvb中的剩余字节;
-
-
返回值
- 创建的 TvbRange;
11.8.2.10. tvb:raw([offset], [length])
获取一个 Tvb 中二进制字节的Lua字符串;
-
参数
-
offset (可选)
第一个字节的位置,默认为0,或者说第一个字节;
-
length (可选)
要获取的该段的长度,默认为 -1, 或者说 Tvb 中剩下的字节;
-
-
返回值
- 该 Tvb 中二进制字节的 Lua 字符串;
11.8.2.11. tvb:__eq()
检测两个 Tvb 是否相等;
11.8.3. TvbRange
TvbRange 表示一个 Tvb 的可使用范围,用于从生成它的 Tvb 中提取数据;
TvbRange 是通过调用一个 Tvb (例如 'tvb(offset,length)') 来创建的。如果 TvbRange 的跨度超出了 Tvb 的范围,创建时将导致运行时错误。
11.8.3.1. tvbrange:tvb()
从一个 TvbRange 创建一个新的 Tvb;
11.8.3.2. tvbrange:uint()
从 TvbRange 中获取一个大端序(Big Endian)(网络顺序)无符号整数,范围必须是1-4个8-bit
长;
-
返回值
- 一个无符号整数;
11.8.3.3. tvbrange:le_uint()
从 TvbRange 中获取一个小端序(Little Endian)(网络顺序)无符号整数,范围必须是1-4个8-bit
长;
-
返回值
- 一个无符号整数;
11.8.3.4. tvbrange:uint64()
从 TvbRange 中获取一个大端序(Big Endian)(网络顺序)无符号64位整数,作为一个 UINT64
对象;
范围必须是1-8个8-bit
长;
-
返回值
- 一个 UINT64 对象;
11.8.3.5. tvbrange:le_uint64()
从 TvbRange 中获取一个小端序(Little Endian)(网络顺序)无符号64位整数,作为一个 UINT64
对象;
范围必须是1-8个8-bit
长;
-
返回值
- 一个 UINT64 对象;
11.8.3.6. tvbrange:int()
从 TvbRange 中获取一个大端序(Big Endian)(网络顺序)带符号整数,范围必须是1-4个8-bit
长;
-
返回值
- 一个带符号整数;
11.8.3.7. tvbrange:le_int()
从 TvbRange 中获取一个小端序(Little Endian)(网络顺序)带符号整数,范围必须是1-4个8-bit
长;
-
返回值
- 一个带符号整数;
11.8.3.8. tvbrange:int64()
从 TvbRange 中获取一个大端序(Big Endian)(网络顺序)带符号64位整数,作为一个 INT64
对象;
范围必须是1-8个8-bit
长;
-
返回值
- 一个
Int64
对象;
- 一个
11.8.3.9. tvbrange:le_int64()
从 TvbRange 中获取一个小端序(Little Endian)(网络顺序)带符号64位整数,作为一个 INT64
对象;
范围必须是1-8个8-bit
长;
-
返回值
- 一个
Int64
对象;
- 一个
11.8.3.10. tvbrange:float()
从 TvbRange 中获取一个大端序(Big Endian)(网络顺序)浮点数,范围必须是1-4个8-bit
长;
-
返回值
- 一个浮点数;
11.8.3.11. tvbrange:le_float()
从 TvbRange 中获取一个小端序(Little Endian)(网络顺序)浮点数,范围必须是1-4个8-bit
长;
-
返回值
- 一个浮点数;
11.8.3.12. tvbrange:ipv4()
从 TvbRange 中获取一个 IPv4 地址,作为一个Address 对象;
-
返回值
- 一个 IPv4 Address 对象;
11.8.3.13. tvbrange:le_ipv4()
从 TvbRange 中获取一个小端序(Little Endian)(网络顺序) IPv4 地址,作为一个Address 对象;
-
返回值
- 一个 IPv4 Address 对象;
11.8.3.14. tvbrange:ipv6()
从 TvbRange 中获取一个 IPv6 地址,作为一个Address 对象;
-
返回值
- 一个 IPv6 Address 对象;
11.8.3.15. tvbrange:ether()
从 TvbRange 中获取一个 Ethernet 地址,作为一个Address 对象;
-
返回值
- 一个 以太网 Address 对象;
-
可能出现的错误
- The range must be 6 bytes long
11.8.3.16. tvbrange:nstime([encoding])
从 TvbRange 获取一个 time_t 结构,作为一个 NSTime 对象;
-
参数
-
encoding (可选)
一个可选的用来编码的
ENC_*
值;
-
-
返回值
- 该 NSTime 对象以及用到的字节数,当失败时为
nil
;
- 该 NSTime 对象以及用到的字节数,当失败时为
-
可能出现的错误
- The range must be 4 or 8 bytes long
11.8.3.17. tvbrange:le_nstime()
从 TvbRange 获取一个 time_t 结构,作为一个 NSTime 对象;
-
返回值
- 该 NSTime 对象;
-
可能出现的错误
- The range must be 4 or 8 bytes long
11.8.3.18. tvbrange:string([encoding])
从 TvbRange 获取一个字符串;
-
参数
-
encoding (可选)
用来编码的方式,默认是
ENC_ASCII
;
-
-
返回值
- 一个包含 TvbRange 中所有字节的字符串,也包括所有的零(e.g., "a\000bc\000");
11.8.3.19. tvbrange:ustring()
从一个 TvbRange 中获取一个大端序(网络顺序)的 UTF-16
编码的字符串。
-
返回值
- 一个包含 TvbRange 中所有字节的字符串,也包括所有的零(e.g., "a\000bc\000");
11.8.3.20. tvbrange:le_ustring()
从一个 TvbRange 中获取一个小端序(网络顺序)的 UTF-16
编码的字符串;
-
返回值
- 一个包含 TvbRange 中所有字节的字符串,也包括所有的零(e.g., "a\000bc\000");
11.8.3.21. tvbrange:stringz([encoding])
从一个 TvbRange 中获取一个零结尾的字符串。
-
参数
-
encoding (可选)
用来编码的方式,默认是
ENC_ASCII
;
-
-
返回值
- 包含 TvbRange 的所有字节的字符串,直到遇到第一个0结束;
11.8.3.22. tvbrange:strsize([encoding])
从一个 TvbRange 中查找一个以0为结尾的字符串的大小,字符串的大小也包括结尾的0;
-
参数
-
encoding (可选)
用来编码的方式,默认是
ENC_ASCII
;
-
-
返回值
- 该以0结尾的字符串的长度;
11.8.3.23. tvbrange:ustringz()
从一个 TvbRange 中获取一个大端序(网络顺序)的 UTF-16
编码的以0结尾的字符串;
-
返回值
- 两个返回值:该以0结尾的字符串及其长度;
11.8.3.24. tvbrange:le_ustringz()
从一个 TvbRange 中获取一个小端序(网络顺序)的 UTF-16
编码的以0结尾的字符串;
-
返回值
- 两个返回值:该以0结尾的字符串及其长度;
11.8.3.25. tvbrange:bytes([encoding])
从一个 TvbRange 中获取一个 ByteArray;
从1.11.4开始,这个函数还需要一个可选的编码参数,可以设置为 ENC_STR_HEX
,将 TvbRange 中的十六进制字符串解码为返回的 ByteArray ;
编码可以使用一个或多个分隔符编码,例如 ENC_SEP_COLON
,以允许在每一对十六进制字符之间出现分隔符,该编码可以是按位或(bitwise-or'ed) ;
现在,返回值也会返回所使用的字节数来作为第二个返回值;
在失败或出错时,两个返回值都会返回nil
;
注意 |
---|
该十六进制字符串的编码方式也需要设置, 比如 ENC_ASCII 或ENC_UTF_8 , 以及 ENC_STR_HEX . |
-
参数
-
encoding (可选)
一个可选的用来编码的
ENC_*
值;
-
-
返回值
- ByteArray 对象或者是
nil
, 以及使用到的字节数或者是nil
;
- ByteArray 对象或者是
11.8.3.26. tvbrange:bitfield([position], [length])
从 TvbRange 中获取一个位域;
-
参数
-
position (可选)
从 TvbRange 开始的位的偏移量,默认为0;
-
length (可选)
该位域的长度,默认为1;
-
-
返回值
- 该位域;
11.8.3.27. tvbrange:range([offset], [length])
从当前 TvbRange 创建一个子-TvbRange ;
-
参数
-
offset (可选)
从 TvbRange 开始的位的偏移量(以8bit计),默认为0;
-
length (可选)
该位域的长度(以8bit计),默认至该 TvbRange 结束;
-
-
返回值
- 该子-TvbRange;
11.8.3.28. tvbrange:uncompress(name)
从一个 TvbRange 中获取一个未经压缩的 TvbRange;
-
参数
-
name
赋予新数据源的名称;
-
-
返回值
该 TvbRange;
11.8.3.29. tvbrange:len()
获取一个 TvbRange 的长度;
11.8.3.30. tvbrange:offset()
获取一个 TvbRange 中的偏移量;
11.8.3.31. tvbrange:raw([offset], [length])
获取一个 TvbRange 中二进制字节的Lua字符串;
-
参数
-
offset (可选)
该 range 中第一个字节的位置,默认为0,或者说第一个字节;
-
length (可选)
要获取的该段的长度,默认为 -1, 或者说 Tvb 中剩下的字节;
-
-
返回值
- 该 TvbRange 中二进制字节的 Lua 字符串;
11.8.3.32. tvbrange:__eq()
检测两个 TvbRange 的内容是否相等;
11.8.3.33. tvbrange:__tostring()
将 TvbRange 转换为一个字符串,字符串可以被截断,所以这主要用于调试或希望截断的情况,例如 "67:89:AB:...";
-
返回值
- 被截断为24个字节的 TvbRange 的Lua十六进制字符串;