Вчера мне пришлось разбирать очень простой файл двоичных данных - это правило, ищите два байта в строке, которые являются как 0xAA, тогда следующий байт будет байтом длины, затем пропускает 9 байтов и выводит заданную сумму данных оттуда. Повторите в конце файла.
Мое решение действительно сработало и очень быстро собралось (хотя я программист C в глубине души, я все еще думаю, что мне было быстрее написать это на Python, чем в C) - НО, он явно не является Pythonic, и он читается как программа на C (и не очень хороший в этом!)
Какой был бы лучший/более питонический подход к этому? Является ли простой 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"