Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from struct import unpack_from, calcsize
- class Types:
- char = 'c'
- int8 = 'b'
- uint8 = 'B'
- int16 = 'h'
- uint16 = 'H'
- int32 = 'i'
- uint32 = 'I'
- int64 = 'q'
- uint64 = 'Q'
- float = 'f'
- double = 'd'
- class BinaryReader:
- def __init__(self, stream, offset, order=">"):
- self.stream = stream
- self.offset = offset
- self.order = order
- def jump(self, offset):
- reader = BinaryReader(self.stream, offset, self.order)
- return reader
- def read(self, pattern):
- size = calcsize(pattern)
- data = unpack_from(self.order + pattern, self.stream, self.offset)
- self.offset += size
- return data[0]
- def read_d(reader):
- d1 = reader.read(Types.int8)
- d2 = reader.read(Types.int8)
- d3 = reader.read(Types.int8)
- d4 = reader.read(Types.uint64)
- return dict(D1=d1, D2=d2, D3=d3, D4=d4)
- def read_c(reader):
- c1 = reader.read(Types.int32)
- c2 = reader.read(Types.int8)
- d_arr_size = reader.read(Types.uint32)
- d_arr_address = reader.read(Types.uint32)
- d_arr_reader = reader.jump(d_arr_address)
- d_arr_addresses = \
- [d_arr_reader.read(Types.uint32) for _ in range(d_arr_size)]
- c3 = [read_d(d_arr_reader.jump(d_addr)) for d_addr in d_arr_addresses]
- int32_arr_size = reader.read(Types.uint32)
- int32_arr_address = reader.read(Types.uint32)
- int32_arr_reader = reader.jump(int32_arr_address)
- c4 = [int32_arr_reader.read(Types.int32) for _ in range(int32_arr_size)]
- c5 = reader.read(Types.int8)
- c6 = reader.read(Types.uint64)
- c7 = [reader.read(Types.uint8) for i in range(7)]
- c8 = reader.read(Types.int32)
- return dict(C1=c1, C2=c2, C3=c3, C4=c4, C5=c5, C6=c6, C7=c7, C8=c8)
- def read_b(reader): # NOTE: DONE
- c_offset = reader.read(Types.uint16)
- c_reader = reader.jump(c_offset)
- b1 = read_c(c_reader)
- b2 = reader.read(Types.uint16)
- return dict(B1=b1, B2=b2)
- def read_a(reader):
- a1 = read_b(reader)
- a2 = reader.read(Types.uint8)
- a3 = reader.read(Types.int32)
- arr_size = reader.read(Types.uint32)
- arr_address = reader.read(Types.uint32)
- arr_reader = reader.jump(arr_address)
- a4 = [arr_reader.read(Types.uint64) for _ in range(arr_size)]
- a5 = reader.read(Types.int8)
- return dict(A1=a1, A2=a2, A3=a3, A4=a4, A5=a5)
- def main(stream):
- return read_a(BinaryReader(stream, 5))
Advertisement
Add Comment
Please, Sign In to add comment