用于联网的压缩二进制数据。

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'

享受吧。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javascript如何找到socket。同一局域网上的IO服务器?   将Java代码格式化为Word/RTF格式   java学习对象以及如何将分配的变量封装到私有变量   java Websocket客户端不在Tomcat中工作   java如何在点击按钮时打开本机表情键盘?   java使用哪个Maven GlassFish插件?   Eclipse Java构建路径不允许添加外部JAR   继承Java6集合。勾选适当的用法   JavaApacheDateUtils:使用多个模式解析日期   java hibernate如何生成查询?   具有id或链接的java Dropbox下载文件或文件夹   java模态对话框未在PrimeFaces 5上显示   java将类对象转换为人类可读的字符串   更新数据库中字段的java通用方法   java无法通过Apache Tomcat访问网络文件夹