首页 编程教程正文

pak文件解析代码

piaodoo 编程教程 2020-02-22 22:04:44 905 0 python教程

本文来源吾爱破解论坛

最近遇到一个pak文件,网上都是各种解析工具,但是感觉都不敢用
干脆自己写一个,现在发出来,方便大家一起使用
附件有一个测试用的pak文件
代码如下:
[Python] 纯文本查看 复制代码

import os
import struct


class Binary:
    def __init__(self, data: [bytearray, bytes, str]):
        self.index = 0
        if isinstance(data, bytearray):
            self.data = data
        elif isinstance(data, bytes):
            self.data = bytearray(data)
        elif isinstance(data, str):
            self.data = bytearray(data.encode(encoding='utf-8'))
        else:
            raise TypeError('data type is invalid:', data.__class__.__name__)
        self.size = len(self.data)

    def read_int8(self) -> int:
        ret = self.data[self.index]
        self.index += 1
        return ret

    def read_int16(self) -> int:
        ret, = struct.unpack('h', self.data[self.index:self.index + 2])
        self.index += 2
        return ret

    def read_int32(self) -> int:
        ret, = struct.unpack('i', self.data[self.index:self.index + 4])
        self.index += 4
        return ret

    def read_int64(self) -> int:
        ret, = struct.unpack('q', self.data[self.index:self.index + 8])
        self.index += 8
        return ret

    def read_string(self) -> str:
        pass

    def read_bytes(self, size: int) -> bytearray:
        if size > self.rest():
            ret = self.data[self.index:]
            self.index += self.rest()
            return ret
        ret = self.data[self.index:self.index + size]
        self.index += size
        return ret

    def __len__(self):
        return len(self.data)

    def rest(self) -> int:
        return len(self.data) - self.index

    @staticmethod
    def bytes2str(data: [bytearray, bytes]):
        out = ''
        if data is None or len(data) == 0:
            return 'Null'
        for b in data:
            if out:
                out += ','
            out += '0x%02X' % b
        out += '\n'
        out += data.decode('utf-8')
        return out


class PakData:
    def __init__(self, br: Binary):
        self.version = br.read_int32()
        self.count = br.read_int32()
        self.coding = br.read_int8()
        self.resources = list()
        for i in range(self.count):
            item = {
                'id': br.read_int16(),
                'offset': br.read_int32(),
                'data': bytearray(),
                'size': 0
            }
            self.resources.append(item)
        for i, item in enumerate(self.resources):
            if i + 1 < self.count:
                item['size'] = self.resources[i + 1]['offset'] - item['offset']
            else:
                item['size'] = len(br) - item['offset']
            item['data'] = br.data[item['offset']:item['offset'] + item['size']]


class PakFile:
    def __init__(self, path: str):
        self.path = path
        if os.path.exists(path):
            self.decode()
            return
        self.data = None

    def set_path(self, path):
        self.path = path

    def decode(self) -> int:
        if os.path.exists(self.path) is False:
            return -1
        with open(self.path, mode='rb') as file:
            raw = bytearray(file.read())
            file.close()
            br = Binary(raw)
            self.data = PakData(br)


def main():
    pak = PakFile(r'.\zh-CN.pak')
    if isinstance(pak.data, PakData):
        print('版本:', pak.data.version)
        print('数量:', pak.data.count)
        print('编码:', pak.data.coding)
        for i in range(pak.data.count):
            print('ID:', pak.data.resources[i]['id'])
            print('偏移:', pak.data.resources[i]['offset'])
            print('大小:', pak.data.resources[i]['size'])
            print('内容:', Binary.bytes2str(pak.data.resources[i]['data']))


if __name__ == '__main__':
    main()

嗨学网

zh-CN.zip

2019-7-6 09:19 上传

点击文件名下载附件

下载积分: 吾爱币 -1 CB

16.46 KB, 下载次数: 51, 下载积分: 吾爱币 -1 CB

测试用的pak文件

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7480.html

搜索