一惹苗、解析
Message 是對字節(jié)流進行操作的一個類套耕,該類允許按字節(jié)添加或者獲取數據构灸,也提供定制化的接口提供各種類型數據的增刪。
Message 使用 ByteIO 來包裝拿到的字節(jié)串數據笋额,ByteIO.read(n) 在讀出 n 個字節(jié)之后游標將向后移動 n 個字節(jié)蠢笋,因此 get_xxx 系列的方法設計初衷應該為按順序依次讀出類型。
Message 類初始化時需要傳入 content(也可以是 None鳞陨,兩種初始化方式目的不一樣):
def __init__(self, content=None):
"""
Create a new SSH2 message.
:param str content:
the byte stream to use as the message content (passed in only when
decomposing a message).
"""
if content is not None:
self.packet = BytesIO(content)
else:
self.packet = BytesIO()
二、用法
1)包裝協議數據
該類提供大量的 add_xxx 方法定制化添加數據的操作瞻惋,通過各類接口傳入指定的數據最終被轉為字節(jié)序列拼接到結尾厦滤,通過 asbytes 可以拿到最終的拼接字節(jié)串。
如果需要懶人添加數據歼狼,可以直接使用 add 進行添加:
def _add(self, i):
if type(i) is bool:
return self.add_boolean(i)
elif isinstance(i, integer_types):
return self.add_adaptive_int(i)
elif type(i) is list:
return self.add_list(i)
else:
return self.add_string(i)
def add(self, *seq):
"""
Add a sequence of items to the stream. The values are encoded based
on their type: str, int, bool, list, or long.
.. warning::
Longs are encoded non-deterministically. Don't use this method.
:param seq: the sequence of items
"""
for item in seq:
self._add(item)
2)解包協議數據
該類提供大量的 get_xxx 來獲取字節(jié)串里面的數據并轉成對應類型掏导,每次獲取一個數據后將會向后移動游標,比如 get_int() 這個接口將會獲取四個字節(jié)的數據羽峰,然后游標向后移動四字節(jié)趟咆,之后再調用類似接口就是從移動后的位置進行讀取添瓷。