2023年12月14日发(作者:)
pkg文件--一种简单的游戏资源打包格式
.pkg文件的格式
[四字节] 固定的内容, 值不重要
[四字节] 文件数目(unsigned int)
[四字节] 文件名表 的偏移(unsigned int)
[四字节] 文件名表 的长度(字节数)(unsigned int)
……
中间一堆 各个文件的内容, 文件内容使用zlib压缩过
……
直到
文件名表:
[两字节] 文件名长度
[文件名长度那么多字节] 文件名
[四字节] 固定的内容,值不重要
[四字节] 文件原长度
[四字节] 文件偏移
[四字节] 文件压缩后的长度
[两字节] 又一个文件名的长度
…
例程:
打包
用法 python dirname
# -*- coding: utf-8 -*-
import zlib, glob, os, sys, struct
filelist = []
class FileVisitor:
def __init__(self, startDir=):
ir = startDir
def run(self):
for dirname, subdirnames, filenames in (ir, True):
for filename in filenames:
_file((dirname, filename))
def visit_file(self, pathname):
({'filename':pathname, 'size':0, 'zlib_size':0, 'offset':0, 'relative_filename': e(th(ir)+,
#print filelist[-1]['relative_filename']
if __name__ == "__main__":
if len([1]) < 3:
print 'few parameter'
else:
source_dirname = [1]
out_filename = [2]
FileVisitor(source_dirname).run()
total = len(filelist)
fp = file(out_filename + '~', 'wb')
('x64x00x00x00')
(('I', len(filelist)))
(('I', 0))
(('I', 0))
offset = 16
for index in range(total):
item = filelist[index]
item['offset'] = offset
infile = file(item['filename'], 'rb')
text = ()
() ()
item['size'] = len(text)
text = ss(text)
item['zlib_size'] = len(text)
(text)
offset += item['zlib_size']
print u'已压缩文件 %d/%d' % (index+1, total)
filename_table_offset = offset
for index in range(total):
item = filelist[index]
(('H', len(item['relative_filename'])))
(item['relative_filename'])
('x01x00x00x00')
(('I', item['offset']))
(('I', item['size']))
(('I', item['zlib_size']))
offset += 2 + len(item['relative_filename']) + 16
print u'已输出路径 %d/%d' % (index+1, total)
filename_table_len = offset - filename_table_offset
()
fp = file(out_filename + '~', 'rb')
ret = file(out_filename, 'wb')
(16)
('x64x00x00x00')
(('I', len(filelist)))
(('I', filename_table_offset))
(('I', filename_table_len))
copy_bytes = 16
total_bytes = offset
while True:
text = (2**20)
(text)
copy_bytes += len(text)
print u'最后的拷贝 %d%%' % (copy_bytes*100.0/total_bytes)
if not text:
break
()
()
(out_filename + '~')
解包
用法 python dirname# -*- coding: utf-8 -*-
import sys, os, struct, zlib
if __name__ == "__main__":
if len() < 3:
print 'few argument'
else:
pkgfilename = [1]
outdirname = [2]
pkgfile = file(pkgfilename, 'rb')
(4)
filenums, = ('I', (4))
filename_table_offset, = ('I', (4))
filename_table_len, = ('I', (4))
(filename_table_offset)
for index in range(filenums):
name_len, = ('H', (2))
name = (name_len)
(4)
offset, = ('I', (4))
size, = ('I', (4))
zlib_size, = ('I', (4))
current_pos = ()
(offset)
text = (zlib_size)
text = ress(text)
(current_pos)
outfilename = (outdirname, (xt(me(pkgfilename))[0], name))
print u'进度 [%d/%d]: ' %(index+1, filenums), (xt(me(pkgfilename))[0], name)
if not (e(outfilename)):
rs(e(outfilename))
file(outfilename, 'wb').write(text)
感谢python各种库的方便
这两个程序也可以作为自己的压缩解压工具
发布评论