Beispiel #1
0
 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)
Beispiel #2
0
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