实现简单 FSM 的 Pythonic 方法是什么?

2024-02-28

昨天我必须解析一个非常简单的二进制数据文件 - 规则是,在一行中查找两个都是 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(使用前将#替换为@)

实现简单 FSM 的 Pythonic 方法是什么? 的相关文章

随机推荐