注意:这不是我在这里找到的任何问题。遗憾的是,提供的“明显”解决方案不适用于
我有自定义字节的自定义协议。
我还有其他自定义字节的协议。
我还有另一个协议,还有其他自定义字节。
(我想你得到的情况)
我想从Python解析它们。
Python是Turing-complete,所以这是可能的。然而,这很慢,相关的库(例如struct
或xdrlib
)太慢了:我没有解析一些数据包,我正在编写客户端来连接高性能服务器。此外,这些库并不打算并行使用。所以这是第一个问题:我需要速度。
还有第二个问题:例如C是Turing-complete,可以从Python执行。 C可以做得足够快而无需太多工作。然而,使用诸如C语言(甚至实际上是Python)之类的语言编写许多完整协议是可怕的:当有人提出协议时,它是通过表格完成的,有时是简单的结构,通常使用DSL 。它们不使用C也不使用Python,因为它不易读取。我不是在谈论在宠物项目中解析GIF文件。我在谈论使用不同协议与不同服务器交换数据:轻松描述结构和内部关系确实是一个巨大的帮助。所以这是第二个问题:我需要清晰度和可重用性。
某些消息传递/序列化/ RPC库(例如Cap'n Proto,Protobuf或MsgPack)都快速,清晰且可重复使用(以低级语言编写并实现DSL)。问题是我无法控制二进制协议,也无法控制特定的消息传递算法:我不能只在系统中插入其中一个,声明一个模式并在一天内调用它。那不行。此外,他们的DSL通常不足以表达模式中的条件。
所以,考虑到所有这些,你如何实现一个可以从Python使用的快速二进制解析器,同时保持整个代码非常清晰和可重用(通过提供DSL解决了其他库)?