用于联网的压缩二进制数据。
netstruct的Python项目详细描述
Netstruct
netstruct类似于struct 用于python的模块,旨在使打包的发送和接收更容易一些 二进制数据。
netstruct在Apache License, Version 2.0下可用。
安装
netstruct可以使用pip:
pip install netstruct
您还可以从git中获取最新的代码 存储库:
git clone git://github.com/stendec/netstruct
netstruct在Python 2.6+、pypy和python 3上运行 (尽管只测试了Python3.3)。
与struct
的差异netstruct与struct有两个不同之处。
首先,它默认使用网络字节顺序,而不是本机字节顺序, 假设你用它通过网络发送数据, 因此,它节省了你的时间。
另外,生成的字符串在使用 非本机字节顺序。
其次,netstruct支持一个新的格式化字符,即美元符号($)。 美元符号表示一个可变长度的字符串,用它的长度编码 在弦的前面。为此,格式化字符 直接在美元符号之前被假定为表示字符串的长度。
示例
这是最基本的:
>>> import netstruct >>> netstruct.pack(b"b$", b"Hello World!") b'\x0cHello World!'
或者:
>>> netstruct.unpack(b"b$", b"\x0cHello World!") [b'Hello World!']
如果您愿意的话,您可以变得更复杂一些:
>>> netstruct.pack(b"ih$5b", 1298, b"largeBiomes", 0, 0, 1, 0, 8) b'\x00\x00\x05\x12\x00\x0blargeBiomes\x00\x00\x01\x00\x08'
当然,您也可以解压缩复杂的数据:
>>> netstruct.unpack(b"bh$h$i", b"'\x00\x07stendec\x00\tlocalhost\x00\x00c\xdd") [39, b'stendec', b'localhost', 25565]
您只需确保使用足够长的字符串:
>>> netstruct.unpack(b"bh$h$i", b"'\x00\x07stendec\x00\tlocalhost\x00") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "site-packages/netstruct.py", line 275, in unpack return NetStruct(format).unpack(data) File "site-packages/netstruct.py", line 165, in unpack raise error("unpack requires a string argument of length %d" % (len(data) + out)) struct.error: unpack requires a string argument of length 25
但是等等,你说。我该如何提供足够长的字符串 当我不可能提前知道数据的长度时,把它拆开? 简单地说,您可以知道长度:
>>> it = netstruct.iter_unpack(b"ih$5b") >>> next(it) 11
iter_unpack函数返回迭代器。每次你这么叫 具有next()的迭代器,或调用其.send()方法,它可以返回 两个值。要么它会返回它希望您下次读取的字节数, 否则它将返回完成的对象。
让我们从上面继续:
>>> it.send(b"\x00\x00\x05\x12\x00\x0b") 16 >>> it.send(b"largeBiomes") 5 >>> it.send(b"\x00\x00\x01\x00\x08 more") [1298, b'largeBiomes', 0, 0, 1, 0, 8]
在那里。我已经发送了足够的数据,所以它返回了 解包数据。在这一点上,我可以拿走我的数据,做任何我想做的事 带着它。
但是等等!我刚刚给迭代器发送了太多数据,现在我丢失了一些 我的绳子,不是吗?这也不是问题。你可以调用迭代器 最后一次,它将返回未使用的剩余数据:
>>> next(it) b' more'
就这么简单。当然,不是每个人都喜欢迭代器,即使他们 比类实例更快,占用的内存更少。Netstruct是 准备好了,它的Unpacker类和obj_unpack。我们最后试试 再举一个例子:
>>> obj = netstruct.obj_unpack(b"ih$5b") >>> obj.remaining 11 >>> obj.feed(b"\x00\x00\x05\x12\x00\x0b") 16 >>> obj.feed(b"largeBiomes") 5 >>> obj.feed(b"\x00\x00\x01\x00\x08 more") 0 >>> obj.result [1298, b'largeBiomes', 0, 0, 1, 0, 8] >>> obj.unused_data b' more'
享受吧。