import struct class Data: def __init__(self, rawdata = b"", off = 0): self.data = rawdata self.offset = off def setData(self, rawdata, off = 0): self.data = rawdata self.offset = off def seek(self, off): self.offset = off def seekEnd(self, off = 0): self.offset = len(self.data) + off def seekRel(self, off = 0): self.offset += off def tell(self): return self.offset def decode(self, fmt): size = struct.calcsize(fmt) val = struct.unpack(fmt, self.data[self.offset : self.offset + size]) self.offset += size return val def encode(self, fmt, *args): data = struct.pack(fmt, *args) self.write(data) def read(self, length): val = self.data[self.offset : self.offset + length] self.offset += length return val def write(self, data): #todo: handle if self.offset == len(self.data): self.data += data self.offset = len(self.data) elif self.offset > len(self.data): self.data += ZERO_BYTE * (self.offset - len(self.data)) self.data += data self.offset = len(self.data) elif self.offset + len(data) >= len(self.data): self.data = self.data[0 : self.offset] + data else: self.data = self.data[0 : self.offset] + data + self.data [self.offset + len(data) : ] def truncate(self, offset = None): if offset is None: offset = self.offset self.data[0 : offset] def __len__(self): return len(self.data) def __str__(self): return str(self.data) def __repr__(self): return repr(self.data)