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各种库的方便

这两个程序也可以作为自己的压缩解压工具