这个,那个,这个任务似乎我拖了很久了= =.....先说声抱歉....+ t+ r7 l& M! p
) J4 g. d4 B! [
其实代码很早之前就写了,不过之前调试一直通不过,后来又是复习又是考试的就一直耽搁了...+ D3 R) c7 j- a( ?( G
- `) p; p* S0 G4 A/ n, _ V
这周末有点空闲,于是狠下心重写了下代码,搞了两天,终于完成了.., i+ m7 V$ W; u9 ?
a3 H+ I+ H4 F1 q. x( n: W
BF的文件格式虽然简单,打包器却不是太好做,我觉得还是有必要写写的
# z8 D: \6 W c" d" d- m9 V/ _3 [. g( c
BF格式有两个特点:- A2 I8 W4 {* y( W. G
其一是文件表的递归存放,这个不算难,Quickbms也可以用
4 ^) h! C: ^: ]$ e. D; W& ?6 [Start Function XX
" D7 C& b- a: S) l6 S" z' H1 X! T+ QEnd Function XX1 ~! m& P0 E. t! g- @
Call Function XX
6 |& J1 G+ b' a4 j3 ?来做递归,不过输出读入时文件名前面要加上目录名和/,还是有点小麻烦....
2 b+ k+ C8 {4 J( l! C+ d/ v, Q3 e+ r, v7 |1 {
其二是,包文件主体中文件的存放顺序并不是按照文件名表中来的,
Q6 i7 Z2 q8 J4 C" O7 E举个例子,文件名表中,每个文件的内容是这样的:
8 R, g* O1 j9 N6 U( t* n文件名长度 文件名 文件大小 偏移量3 b. S/ B, p4 j: S* U
$ `) ~1 M- @/ a! M6 [' B
也就是说,偏移量才代表了该文件在包中的位置,偏移量最小的文件,就是主体中存放在最前面的,却不是文件名表中的第一个。
' v; D1 Z0 T. X0 H$ q5 c9 j1 Y6 c) B6 ^' @1 M" ^; g
这是很麻烦的一点。. _7 f& L$ T' N: o
这样一来,打包的时候就不能按照文件名表中文件顺序来打包,而必须根据偏移量大小顺序来依次打包。
. f! h( b( y: @1 g; ]
) Z) Y' J/ F& ^! U8 \5 u" v这儿我用的方法是把每个文件的信息(文件名、大小、偏移)存放到一个结构数组中。
/ [! U' G& @0 a" ^4 ^然后对这个数组按照偏移量做个排序,然后按照排完的顺序依次打包。
" a; i! |$ A# b6 z1 v% V之前肥牛的图形打包器似乎用了数据库,不过我看不太懂delphi,也不懂数据库....) f1 c: p4 _4 f0 z
; o; p0 j5 `$ r
目前还存在的问题是,这个打包器无法通用:6 p& G' k4 j# l0 p
) |" o: ~6 ?3 D8 W% @/ `因为文件数量比较大,考虑到排序算法的效率,我用了结构数组做Quicksort,而用数组的话,数组大小(即文件数量)就是确定的值了。如果要大小可变,那么似乎用链表比较合适,不过用链表做quicksort我搞不定....做insertionsort效率又比较低下....不知有没有高人有更好的办法! l* D F. f# [% e) Y8 H) s. R
" V% G3 V+ B7 ~) z4 w不过实际要通用也很容易,之前解包出来后看一下文件数量
4 c* _$ ~, l$ |( ]9 G然后把代码开头 #define FILENUM 760 后面定义的数值改成文件数量,重新编译一下就行了。
6 s6 K1 v- B. |+ s( u+ J
5 O- H' ? Y, ?: a解包脚本,打包器,代码都在压缩包里,打包代码我写了不少注释,欢迎各位高手指正。. I, F- g! { M6 r6 m% }7 w
1 M/ b$ p9 X% q( t
打包器使用方法,和解包后的文件放在同一文件夹下,命令提示符下输入 pack Filename3 t/ Q, X0 \3 j. ]. s. a2 Y5 p1 Z
filename即要输出的包文件名 |