昨天我必须解析一个非常简单的二进制数据文件 - 规则是,在一行中查找两个都是 0xAA 的字节,然后下一个字节将是一个长度字节,然后跳过 9 个字节并输出给定数量的数据那里。重复到文件末尾。
我的解决方案确实有效,并且很快就组合在一起了(尽管我本质上是一名 C 程序员,但我仍然认为用 Python 编写这个比用 C 编写要快) - 但是,很明显完全不是 Pythonic,它读起来就像一个 C 程序(而且不是一个很好的程序!)
对此,更好/更Pythonic 的方法是什么?像这样的简单 FSM 在 Python 中仍然是正确的选择吗?
我的解决方案:
#! /usr/bin/python
import sys
f = open(sys.argv[1], "rb")
state = 0
if f:
for byte in f.read():
a = ord(byte)
if state == 0:
if a == 0xAA:
state = 1
elif state == 1:
if a == 0xAA:
state = 2
else:
state = 0
elif state == 2:
count = a;
skip = 9
state = 3
elif state == 3:
skip = skip -1
if skip == 0:
state = 4
elif state == 4:
print "%02x" %a
count = count -1
if count == 0:
state = 0
print "\r\n"
我见过的在 Python 中实现 FSM 的最酷的方法是通过生成器和协程。看到这个迷人的 Python 帖子 http://gnosis.cx/publish/programming/charming_python_b5.html举个例子。伊莱·本德斯基也有对这个主题的出色处理 http://eli.thegreenplace.net/2009/08/29/co-routines-as-an-alternative-to-state-machines/.
如果协程不是熟悉的领域,David Beazley 的关于协程和并发的有趣课程 http://www.dabeaz.com/coroutines/index.html是一个出色的介绍。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)