pkg文件--一种简单的游戏资源打包格式

更新时间:2023-07-19 05:31:01 阅读: 评论:0

pkg⽂件--⼀种简单的游戏资源打包格式
.pkg⽂件的格式
[四字节] 固定的内容, 值不重要
[四字节] ⽂件数⽬(unsigned int)
[四字节] ⽂件名表 的偏移(unsigned int)
[四字节] ⽂件名表 的长度(字节数)(unsigned int)
……
中间⼀堆 各个⽂件的内容, ⽂件内容使⽤zlib压缩过
……
直到
⽂件名表:
[两字节] ⽂件名长度
[⽂件名长度那么多字节] ⽂件名
兔子的名片[四字节] 固定的内容,值不重要
[四字节] ⽂件原长度
[四字节] ⽂件偏移
[四字节] ⽂件压缩后的长度
[两字节] ⼜⼀个⽂件名的长度
例程:
打包 PKGEncode.py
⽤法 python PKGEncode.py dirname pathname.pkg
# -*- coding: utf-8 -*-
近视闪光
import zlib, glob, os, sys, struct
filelist = []
class FileVisitor:
def__init__(lf, startDir=os.curdir):
lf.startDir = startDir
def run(lf):
for dirname, subdirnames, filenames in os.walk(lf.startDir, True):
for filename in filenames:
lf.visit_file(os.path.join(dirname, filename))
def visit_file(lf, pathname):
filelist.append({'filename':pathname, 'size':0, 'zlib_size':0, 'offt':0, 'relative_filename': place(path(lf.startDir)+os.p, #print filelist[-1]['relative_filename']
if __name__ == "__main__":
if len(sys.argv[1]) < 3:
print'few parameter'
el:
source_dirname = sys.argv[1]
out_filename = sys.argv[2]
FileVisitor(source_dirname).run()
total = len(filelist)
fp = file(out_filename + '~', 'wb')
fp.write('\x64\x00\x00\x00')
fp.write(struct.pack('I', len(filelist)))
fp.write(struct.pack('I', 0))
fp.write(struct.pack('I', 0))
offt = 16
海成语接龙for index in range(total):
item = filelist[index]
item['offt'] = offt
佳能c100
infile = file(item['filename'], 'rb')
text = ad()
infile.clo()
infile.clo()
item['size'] = len(text)
text = press(text)
item['zlib_size'] = len(text)
fp.write(text)
offt += item['zlib_size']
print u'已压缩⽂件 %d/%d' % (index+1, total)
filename_table_offt = offt
for index in range(total):
item = filelist[index]
fp.write(struct.pack('H', len(item['relative_filename'])))
燕窝有什么功效fp.write(item['relative_filename'])
fp.write('\x01\x00\x00\x00')
fp.write(struct.pack('I', item['offt']))
fp.write(struct.pack('I', item['size']))
fp.write(struct.pack('I', item['zlib_size']))
offt += 2 + len(item['relative_filename']) + 16
print u'已输出路径 %d/%d' % (index+1, total)
filename_table_len = offt - filename_table_offt
fp.clo()
fp = file(out_filename + '~', 'rb')
ret = file(out_filename, 'wb')
差不多的近义词ret.write('\x64\x00\x00\x00')
河漫滩ret.write(struct.pack('I', len(filelist)))
ret.write(struct.pack('I', filename_table_offt))
ret.write(struct.pack('I', filename_table_len))
copy_bytes = 16
total_bytes = offt
while True:
text = fp.read(2**20)
ret.write(text)
copy_bytes += len(text)
print u'最后的拷贝 %d%%' % (copy_bytes*100.0/total_bytes)
if not text:
break
fp.clo()
ret.clo()
解包 PKGDecode.py
⽤法 python PKGDecode.py pathname.pkg dirname
# -*- coding: utf-8 -*-
import sys, os, struct, zlib
if __name__ == "__main__":
if len(sys.argv) < 3:
print'few argument'
el:
pkgfilename = sys.argv[1]
outdirname = sys.argv[2]
pkgfile = file(pkgfilename, 'rb')
filenums, = struct.unpack('I', ad(4))
filename_table_offt, = struct.unpack('I', ad(4))
filename_table_len, = struct.unpack('I', ad(4))
pkgfile.ek(filename_table_offt)
for index in range(filenums):
name_len, = struct.unpack('H', ad(2))节奏是什么意思
name = ad(name_len)
offt, = struct.unpack('I', ad(4))
size, = struct.unpack('I', ad(4))
zlib_size, = struct.unpack('I', ad(4))
current_pos = ll()
pkgfile.ek(offt)
text = ad(zlib_size)
text = zlib.decompress(text)
pkgfile.ek(current_pos)
outfilename = os.path.join(outdirname, os.path.join(os.path.splitext(os.path.baname(pkgfilename))[0], name)) print u'进度 [%d/%d]: ' %(index+1, filenums), os.path.join(os.path.splitext(os.path.baname(pkgfilename))[0], name)
if not ists(os.path.dirname(outfilename)):
os.makedirs(os.path.dirname(outfilename))
file(outfilename, 'wb').write(text)
感谢python各种库的⽅便
这两个程序也可以作为⾃⼰的压缩解压⼯具

本文发布于:2023-07-19 05:31:01,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1087347.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:压缩   长度   作为   字节   名表
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图