| 26 | |
| 27 | |
| 28 | class _StructStream(object): |
| 29 | def __init__(self, data): |
| 30 | self._data = data |
| 31 | self._offset = 0 |
| 32 | |
| 33 | def read(self, fmt): |
| 34 | result = struct.unpack_from(fmt, self._data, self._offset) |
| 35 | self._offset += struct.calcsize(fmt) |
| 36 | return result |
| 37 | |
| 38 | def read_uint8(self): |
| 39 | return self.read('B')[0] |
| 40 | |
| 41 | def read_uint16(self): |
| 42 | return self.read('H')[0] |
| 43 | |
| 44 | def read_int32(self): |
| 45 | return self.read('i')[0] |
| 46 | |
| 47 | def read_uint32(self): |
| 48 | return self.read('I')[0] |
| 49 | |
| 50 | def read_float(self): |
| 51 | return self.read('f')[0] |
| 52 | |
| 53 | def read_raw(self, size): |
| 54 | result = self._data[self._offset:self._offset + size] |
| 55 | self._offset += size |
| 56 | return result |
| 57 | |
| 58 | def seek(self, offset): |
| 59 | self._offset = offset |
| 60 | |
| 61 | def offset(self): |
| 62 | return self._offset |
| 63 | |
| 64 | def size(self): |
| 65 | return len(self._data) |
| 66 | |
| 67 | def remaining(self): |
| 68 | return len(self._data) - self._offset |
| 69 | |
| 70 | def get_data(self, offset, length): |
| 71 | return self._data[offset:offset + length] |
| 72 | |
| 73 | |
| 74 | class _StringTable(object): |