friedkeenan/pak

GitHub: friedkeenan/pak

Pak 是一个 Python 数据包序列化库,用于在原始二进制数据与有意义的结构化值之间进行声明式的相互转换。

Stars: 11 | Forks: 1

# Pak [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/friedkeenan/pak/ci.yml?label=checks)](https://github.com/friedkeenan/pak/commit/HEAD) [![Read the Docs](https://img.shields.io/readthedocs/pak)](https://pak.readthedocs.io/) [![Codecov](https://img.shields.io/codecov/c/github/friedkeenan/pak)](https://app.codecov.io/gh/friedkeenan/pak) [![License](https://img.shields.io/github/license/friedkeenan/pak)](https://github.com/friedkeenan/pak/blob/main/LICENSE) [![Python Version Support](https://img.shields.io/pypi/pyversions/pak)](https://pypi.org/project/pak/) Pak 是一个简单却强大且易于扩展的 Python 库,用于在原始数据和可用且具有实际意义的值之间进行转换。 以下是一个简单的用法示例: ``` import pak raw_data = ( # Represents the value '0'. b"\x00" + # A string encoded in 4 bytes, with characters "abcd". b"\x04" + b"abcd" + # Two contiguous 16-bit, little-endian numbers, '1' and '2'. b"\x01\x00" + b"\x02\x00" ) class MyPacket(pak.Packet): byte: pak.Int8 string: pak.PrefixedString(pak.UInt8) array: pak.UInt16[2] # 从 raw data 中解包一个 packet。 packet = MyPacket.unpack(raw_data) # 每个字段都将从 raw data 中解包出相应的值。 assert packet == MyPacket( byte = 0, string = "abcd", array = [1, 2], ) # 将 packet 打包成 raw data。 packet_data = packet.pack() # 打包后的 data 将与初始的 raw data 相同。 assert packet_data == raw_data ``` ## 功能 - 声明式且简单的 API,用于定义数据包结构。 - 高度通用,能够相对轻松地适配任何数据包协议。 - 能够自定义原始数据与可用值之间的 marshaling 方式。 - 可组合的 API,让你能够轻松利用现有代码并减少重复。 - 提供了一系列具有广泛适用性的实用功能,例如对数值、字符串和 enum 值的 marshaling。 - 大量高质量的测试,确保你的代码能够按预期工作。 - 详尽的文档,帮助你了解有哪些可用的 API 以及如何使用它们。 - 以及更多! ## 安装 要安装 Pak,只需通过 pip 安装即可: ``` $ pip install pak ``` ## 文档 Pak 的文档位于 https://pak.readthedocs.io。在那里你可以找到包含快速入门在内的教程,以及详细介绍 Pak 所提供 API 的参考手册。 ## 目标 创建这个库的初衷是,我当时正在开发一个用于 Minecraft 网络协议的库,它的 API 与现在 Pak 中的 API 非常相似。后来我想为其他协议编写代码,发现自己重复了大量为 Minecraft 协议编写的代码。因此,我创建了这个库,这样我就不需要为每一个编写代码的协议重复造轮子。基于这一初衷,以下是 Pak 的目标: - 最重要的一点是,保持令人愉悦且易于阅读的 API。 - 能够轻松应对许多(甚至所有)数据包协议。 - 拥有坚实的基础功能或具有广泛适用性的功能。 - 易于扩展,能够适应特定协议可能具有的各种特性。 - 成为我学习 API 设计和项目维护的一个途径。 特别指出,Pak 的目标不包括性能。我尚未对该库进行基准测试,目前也不打算仔细检查并确保所有代码都经过优化,当然我也不会刻意去降低代码性能。未来我可能会去改进特定功能的性能,但总的来说,性能并不是我特别追求的目标。 ## 致谢 - [ammaraskar/pyCraft](https://github.com/ammaraskar/pyCraft):感谢它最初启发了我去着手创建这个库及其 API,尽管最终成品与它并没有太多相似之处。 - [ManimCommunity/manim](https://github.com/ManimCommunity/manim/):让我获得了编写测试、文档以及维护一个严肃项目的经验。 - [Write the Docs 的新手指南](https://www.writethedocs.org/guide/writing/beginners-guide-to-docs/):提供了一份关于优秀文档实践的优秀指南。 - 我用来对 Pak 进行压力测试的各种协议,以确保它具有足够的通用性并适用于各种格式。这些协议包括但不限于 [Minecraft](https://www.minecraft.net/)、[Transformice](https://www.transformice.com/)、[CraftyBoss/SuperMarioOdysseyOnline](https://github.com/CraftyBoss/SuperMarioOdysseyOnline) 和 [Pwn Adventure 3: Pwnie Island](https://www.pwnadventure.com/)。
标签:Python, 内核驱动, 开发库, 数据封包, 数据序列化, 无后门, 网络协议, 逆向工具