Вы могли бы дать своим константным именам состояний вместо использования 0, 1, 2 и т. Д. Для улучшения читаемости.
Вы можете использовать словарь для отображения (current_state, input) -> (next_state)
, но это на самом деле не позволяет выполнять дополнительную обработку во время переходов. Если вы не включите некоторую «функцию перехода», чтобы выполнить дополнительную обработку.
Или вы можете использовать не-FSM подход. Я думаю, что это будет работать до тех пор, пока 0xAA 0xAA
появляется только тогда, когда указывает «начало» (не отображается в данных).
with open(sys.argv[1], 'rb') as f:
contents = f.read()
for chunk in contents.split('\xaa\xaa')[1:]:
length = ord(chunk[0])
data = chunk[10:10+length]
print data
Если он появляется в данных, вы можете вместо этого использовать string.find('\xaa\xaa', start)
для сканирования строки, задав аргумент start
, чтобы начать поиск конца последнего блока данных. Повторяйте, пока не вернет -1.