Te4nick

kispython11

May 29th, 2023
743
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.43 KB | None | 0 0
  1. from struct import unpack_from, calcsize
  2.  
  3.  
  4. class Types:
  5.     char = 'c'
  6.     int8 = 'b'
  7.     uint8 = 'B'
  8.     int16 = 'h'
  9.     uint16 = 'H'
  10.     int32 = 'i'
  11.     uint32 = 'I'
  12.     int64 = 'q'
  13.     uint64 = 'Q'
  14.     float = 'f'
  15.     double = 'd'
  16.  
  17.  
  18. class BinaryReader:
  19.     def __init__(self, stream, offset, order=">"):
  20.         self.stream = stream
  21.         self.offset = offset
  22.         self.order = order
  23.  
  24.     def jump(self, offset):
  25.         reader = BinaryReader(self.stream, offset, self.order)
  26.         return reader
  27.  
  28.     def read(self, pattern):
  29.         size = calcsize(pattern)
  30.         data = unpack_from(self.order + pattern, self.stream, self.offset)
  31.         self.offset += size
  32.         return data[0]
  33.  
  34.  
  35. def read_d(reader):
  36.     d1 = reader.read(Types.int8)
  37.     d2 = reader.read(Types.int8)
  38.     d3 = reader.read(Types.int8)
  39.     d4 = reader.read(Types.uint64)
  40.     return dict(D1=d1, D2=d2, D3=d3, D4=d4)
  41.  
  42.  
  43. def read_c(reader):
  44.     c1 = reader.read(Types.int32)
  45.     c2 = reader.read(Types.int8)
  46.     d_arr_size = reader.read(Types.uint32)
  47.     d_arr_address = reader.read(Types.uint32)
  48.     d_arr_reader = reader.jump(d_arr_address)
  49.     d_arr_addresses = \
  50.         [d_arr_reader.read(Types.uint32) for _ in range(d_arr_size)]
  51.     c3 = [read_d(d_arr_reader.jump(d_addr)) for d_addr in d_arr_addresses]
  52.     int32_arr_size = reader.read(Types.uint32)
  53.     int32_arr_address = reader.read(Types.uint32)
  54.     int32_arr_reader = reader.jump(int32_arr_address)
  55.     c4 = [int32_arr_reader.read(Types.int32) for _ in range(int32_arr_size)]
  56.     c5 = reader.read(Types.int8)
  57.     c6 = reader.read(Types.uint64)
  58.     c7 = [reader.read(Types.uint8) for i in range(7)]
  59.     c8 = reader.read(Types.int32)
  60.     return dict(C1=c1, C2=c2, C3=c3, C4=c4, C5=c5, C6=c6, C7=c7, C8=c8)
  61.  
  62.  
  63. def read_b(reader):  # NOTE: DONE
  64.     c_offset = reader.read(Types.uint16)
  65.     c_reader = reader.jump(c_offset)
  66.     b1 = read_c(c_reader)
  67.     b2 = reader.read(Types.uint16)
  68.     return dict(B1=b1, B2=b2)
  69.  
  70.  
  71. def read_a(reader):
  72.     a1 = read_b(reader)
  73.     a2 = reader.read(Types.uint8)
  74.     a3 = reader.read(Types.int32)
  75.     arr_size = reader.read(Types.uint32)
  76.     arr_address = reader.read(Types.uint32)
  77.     arr_reader = reader.jump(arr_address)
  78.     a4 = [arr_reader.read(Types.uint64) for _ in range(arr_size)]
  79.     a5 = reader.read(Types.int8)
  80.     return dict(A1=a1, A2=a2, A3=a3, A4=a4, A5=a5)
  81.  
  82.  
  83. def main(stream):
  84.     return read_a(BinaryReader(stream, 5))
  85.  
Advertisement
Add Comment
Please, Sign In to add comment