最近研究资源文件发现好几个游戏的文件都喜欢用这样的格式9 A' ?: v! X$ E; M& ]0 B% S, |
' |6 M. D; |) O& O
文件头
b4 O$ f" i; G6 j/ {% s1 X数据块(zlib)
4 ]& p$ k. d; _) f9 F; F文件名表
9 W0 w3 u, g* Y* y9 x1 B
* F8 C3 \" @; Q0 n5 v2 {' u; G其中文件头格式为
& D2 x$ F2 z: C3 q/ f: b3 n: r$ i' ^. K9 G/ `- y6 Z
IDSTRING(P1)+资源文件版本号packver(4)+文件数量files(4)+文件名表地址指针RES_START(4)+NULL(P2)4 B, h' Q. A, o) I: \: Y% |
: ~" B; A; V" i$ S4 |; R1 x! ~文件名表格式为" R( X$ R1 B: W2 I
7 [: n9 n4 W4 ]) e- {" }6 E文件名NAME(F1)+文件压缩大小ZSIZE(4)+文件解压大小SIZE(4)+文件在资源文件长度FSIZE(4)+文件数据地址偏移OFFSET(4)+filever文件版本号(4)+NULL(F2)
# B! G' W! {9 a% Z, D5 @' o
7 n- s9 f# u% \& \3 ~, A一般情况下,文件压缩大小ZSIZE=文件在资源文件长度FSIZE,但是有时候后者较长,可能是预留空间用于更新维护。
, H) Y; z- E Q" x% j) O/ p* |6 q% V8 X7 Y0 r: a9 ? F
这种格式的好处是,当资源文件很大的时候更新维护都比较方便,把新的文件压缩后插入数据块的末尾,然后只要在文件名表后加上更新文件的文件名表就行,然后修正文件数量,其他数据基本可以不动。% S6 y6 U2 S% h
4 ?5 N* c# j5 E. g所以这种文件解包方法都可以这样,略有不同的可以稍微修改下7 o! D/ J& t: S8 M6 x. U( d
getdstring IDSTRING 0xP11 m/ e* t3 q$ ~& s
get packver long$ v% T) k$ J; ^( V% o4 Y
get FILES long2 K. S, Q1 @- F; M3 b
get RES_START long& y4 Y3 P4 D1 r* _
getdstring NULL 0xP2- s8 [ |- b. W/ f7 S
' S4 |; \* ~8 H7 F
goto RES_START
" w% g) ?0 [7 ^# E" d8 L; ?5 pfor i = 0 < FILES
+ p) k( v, r5 s) B" P; ugetdstring NAME 0xF1
7 R7 m9 @ t5 p$ Uget ZSIZE long7 H' ~& N( T/ X3 a3 a
get SIZE long) D0 l' `9 y8 E1 t* U( W& n
get FSIZE long/ x( I. h+ e/ m) O
get OFFSET long
) D. ^6 o9 s( O) Pget filever long
, f t4 b3 K2 {8 {1 |getdstring NULL1 0xF2. b/ W; J5 x" R$ g7 X
clog NAME OFFSET ZSIZE SIZE' B! Y' x* `! G
next i
2 D" D& S8 M& N) c$ W" P6 H# J! Z1 v. n7 u6 [
现在,想求高人设计个通用的打包工具,命令行或GUI都可以
- r! H2 W% k" t6 r3 k, f4 o+ J/ @其中变量IDSTRING P1 P2 F1 F2键盘获取,其他变量根据待打包文件修正。
( a) n6 J( N' ^% P/ O6 W" P文件版本号Packver、Filever通过读取文件录入,没有没有该文件直接置NULL,FSIZE直接等于SIZE方便处理。 |