'get_until' ersetzten habe ich aber nicht geschafft. Dafür hab ich es nun anders gemacht:
Code: Alles auswählen
import itertools
def to16bit(values):
return (values[0]<<8) | values[1]
def get_until(g, until):
while True:
item = g.next()
if item == until:
raise StopIteration()
yield item
def get_16bit_char(g):
values = itertools.islice(g, 2)
values = list(values)
return (values[0]<<8) | values[1]
class CodeLine(object):
def __init__(self, line_pointer, line_no, code):
assert isinstance(line_no, int), "Line number not integer, it's: %s" % repr(line_no)
self.line_pointer = line_pointer
self.line_no = line_no
self.code = code
def __repr__(self):
return "<CodeLine pointer: %s line no: %s code: %s>" % (
repr(self.line_pointer), repr(self.line_no), repr(self.code)
)
class CodeLines(object):
def __init__(self,data):
self.code_lines = []
while True:
line_pointer = list(itertools.islice(data, 2))
if line_pointer == [0x00, 0x00]:
# end of block
break
line_pointer = to16bit(line_pointer)
line_number = get_16bit_char(data)
code = list(get_until(data, 0x00))
self.code_lines.append(
CodeLine(line_pointer, line_number, code)
)
data = iter(
(0x1e,0x1a,0x0,0x1,0x87,0x20,0x22,0x4c,0x49,0x4e,0x45,0x20,0x4e,0x55,0x4d,0x42,0x45,0x52,0x20,0x54,0x45,0x53,0x54,0x22,0x0,
0x1e,0x23,0x0,0xa,0x87,0x20,0x31,0x30,0x0,
0x1e,0x2d,0x0,0x64,0x87,0x20,0x31,0x30,0x30,0x0,
0x1e,0x38,0x3,0xe8,0x87,0x20,0x31,0x30,0x30,0x30,0x0,
0x1e,0x44,0x27,0x10,0x87,0x20,0x31,0x30,0x30,0x30,0x30,0x0,
0x1e,0x50,0x80,0x0,0x87,0x20,0x33,0x32,0x37,0x36,0x38,0x0,
0x1e,0x62,0xf9,0xff,0x87,0x20,0x22,0x45,0x4e,0x44,0x22,0x3b,0x36,0x33,0x39,0x39,0x39,0x0,
0x0,0x0)
)
code_lines = CodeLines(data)
for line in code_lines.code_lines:
print repr(line)