用于编码和解码netstring的模块。
pynetstring的Python项目详细描述
用于编码和解码netstring的模块。查看netstring的定义 在https://cr.yp.to/proto/netstrings.txt。
要求
pynetstring是为python 3编写的。
用法
编码
netstring_bytes = pynetstring.encode('Hello') # Will give b'Hello' print(netstring_bytes)
解码
在最简单的情况下,当我们确定我们试图 在netstring边界上解码结束我们可以简单地做:
# data_list will be an list of bytes. decoded_list = pynetstring.decode('5:Hello,6:World!') # Will give [b'Hello', b'World!'] print(decoded_list)
然而,在许多情况下,例如当netstring数据通过网络传输时, 到达的数据块可能与netstring边界不对齐。 例如,一个数据块可能包含一个netstring,然后是下一个的一部分。 要处理此问题,请调用decoder.feed(),它将缓冲和解析数据并 在完全接收到解码数据后立即发出。
decoder = pynetstring.Decoder() # Will give [] print(decoder.feed('5:He')) # Will give [b'Hello', b'World!'] print(decoder.feed('llo,6:World!,5:ag')) # Will give [b'again'] print(decoder.feed('ain,'))
接收端可能是这样的:
decoder = pynetstring.Decoder() def handle_network_data(data): decoded_list = decoder.feed(data) for item in decoded_list: print(item)
数据编码
无论发送到encode()的数据类型如何,它都将始终 返回二进制数据,即python字节。decode()返回的数据 decoder.feed()也是二进制的。这是因为解码器不能 对原始数据的编码做任何假设。如果你知道的话 输入的数据可以用特定的方式或编码来解释, 例如,utf-8,您必须显式地进行转换。
encoded = pynetstring.encode(u'Hello World!') # This will be <class 'bytes'> print(type(encoded)) decoded_list = pynetstring.decode(encoded) # This will be <class 'bytes'> print(type(decoded_list[0])) # This will return the original unicode string u'Hello World!' print(decoded_list[0].decode('utf-8'))