Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中高效、清晰地解析自定义二进制格式?_Python_Linux_Networking - Fatal编程技术网

如何在Python中高效、清晰地解析自定义二进制格式?

如何在Python中高效、清晰地解析自定义二进制格式?,python,linux,networking,Python,Linux,Networking,注意:这不是我在这里发现的任何问题的重复。不幸的是,提供的“明显”解决方案不适用于这里 我有一个带有自定义字节的自定义协议 我有另一个协议和其他自定义字节 我有另一个协议,还有其他自定义字节 (我想你明白了) 我想从Python解析它们。 Python是图灵完备的,所以这是可能的。但是,这很慢,而且相关的库(例如struct或xdrlib)也太慢了:我不是在剖析一些数据包,而是在编写客户端以与高性能服务器接口的代码。此外,这些LIB实际上并不打算并行使用。所以这是第一个问题:我需要速度 还有

注意:这不是我在这里发现的任何问题的重复。不幸的是,提供的“明显”解决方案不适用于这里


我有一个带有自定义字节的自定义协议

我有另一个协议和其他自定义字节

我有另一个协议,还有其他自定义字节

(我想你明白了)

我想从Python解析它们。


Python是图灵完备的,所以这是可能的。但是,这很慢,而且相关的库(例如
struct
xdrlib
)也太慢了:我不是在剖析一些数据包,而是在编写客户端以与高性能服务器接口的代码。此外,这些LIB实际上并不打算并行使用。所以这是第一个问题:我需要速度

还有第二个问题:例如,C是图灵完成的,可以从Python执行。C不需要做很多工作就可以做得足够快。然而,用C语言(甚至实际上是Python)编写许多完整的协议是非常糟糕的:当有人提出一个协议时,它是通过表完成的,有时是简单的结构,通常使用DSL。他们不使用C或Python,因为它不容易阅读。我不是说在pet项目中解析GIF文件。我说的是在不同的服务器上使用不同的协议交换数据:轻松描述结构和内部关系真的会有很大帮助。这就是第二个问题:我需要清晰性和可重用性

一些消息传递/序列化/RPC库,例如Cap'n Proto、Protobuf或MsgPack都是快速、清晰和可重用的(用低级语言编码并实现DSL)。问题是,我无法控制二进制协议,也无法控制特定的消息传递算法:我不能只在系统中插入其中一个,声明一个模式,然后一天就调用它。那不行。此外,他们的DSL通常没有足够的表达能力,例如在模式中包含条件


那么,考虑到所有这些,您将如何实现一个可从Python使用的快速二进制解析器,同时保持整个代码非常清晰和可重用(其他库通过提供DSL解决了什么问题)?

您有一个问题的答案:为您的protocol.ProtocolS构建自己的快速、清晰和可重用的库。他们中的一些人用相似但有点不兼容的方言说话。我可以自己写,但我不敢相信它还不存在:我不是第一个实现二进制解析器的人,我真的不认为人们每次都会从头开始重新实现所有东西。不过,我可能没有用正确的词在正确的地方进行搜索。在某个时候,你必须咬紧牙关:要么用C语言进行搜索,速度更快;要么用python进行搜索,灵活性更强。你可以在你认为合适的时候将这两种语言交错(例如在特定的点调用python钩子),但这两种语言不会神奇地合并。也许可以在+?中实现解析器?所以人们每次有东西要解析时都会从头开始?!面向对象。没有工具来生成这样的代码,人们每次都必须手动完成。。。幸运的是那些可以使用MsgPack的人!