def load(self): _path = path.join(self.root_dir, 'database', 'master_card') with open(_path, 'rb') as _f: buf = Reader(_f) count = buf.read_int() # 卡牌数量 offsets = [0] * count self.cards = cards = [None] * count for i in range(count): cards[i] = MACard() offsets[i] = buf.read_int() for i, card in enumerate(cards): buf.seek(offsets[i]) card.load(buf)
class ClassParser: def __init__(self, file): self.file = file self.reader = Reader() def parse_class(self): clazz = JavaClass() self.reader.load_class(self.file) if self.reader.read_int() != 0xCAFEBABE: raise Exception('Not a valid Java class file') clazz.version['minor'] = self.reader.read_short() clazz.version['major'] = self.reader.read_short() pool = self.parse_constant_pool(clazz) clazz.pool = pool clazz.access_flags = pool.get_value(self.reader.read_short()) clazz.class_name = pool.get_value(self.reader.read_short()) clazz.superclass_name = pool.get_value(self.reader.read_short()) clazz.interfaces = self.parse_interface_table(clazz) clazz.fields = self.parse_fields(clazz, pool) clazz.methods = self.parse_methods(clazz, pool) clazz.attributes = Attribute.parse_attributes(self.reader, pool) return clazz def parse_constant_pool(self, clazz): pool = ConstantPool(self.reader.read_short()) pool.parse(self.reader) return pool def parse_interface_table(self, clazz): size = self.reader.read_short() for i in range(size): self.reader.read_byte() return None def parse_fields(self, clazz, pool): fields = [] for i in range(self.reader.read_short()): field = Field() field.parse(self.reader, pool) fields.append(field) return fields def parse_methods(self, clazz, pool): methods = [] for i in range(self.reader.read_short()): m = Method() m.parse(self.reader, pool) methods.append(m) return methods