昨天我不得不解析一个非常简单的二进制数据文件 - 规则是,在一行中查找两个都是 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"