这个,那个,这个任务似乎我拖了很久了= =.....先说声抱歉....
& j! i7 c. @& [% x! x- V
3 ~, p# ], o" s( M其实代码很早之前就写了,不过之前调试一直通不过,后来又是复习又是考试的就一直耽搁了...
% l" x% e2 p ?9 h1 l
j+ f5 p' F2 [8 u+ M1 v) M这周末有点空闲,于是狠下心重写了下代码,搞了两天,终于完成了..
4 I! e( f# a. T' ^% X% d* t' h! x( R) O4 P) N- H* @! O, T+ R$ m
BF的文件格式虽然简单,打包器却不是太好做,我觉得还是有必要写写的0 y0 q( J* d. f e7 Y: O; A9 T
) N! C- p7 M% M, _3 q0 H2 F) u
BF格式有两个特点:
: k5 o4 d$ [. o5 B其一是文件表的递归存放,这个不算难,Quickbms也可以用
) w! y( \; ^ e& y6 k* CStart Function XX
6 H* |4 X" a6 C# VEnd Function XX$ a Z0 ], Z1 J6 e
Call Function XX
/ M/ W0 t7 A9 v4 a. d$ A来做递归,不过输出读入时文件名前面要加上目录名和/,还是有点小麻烦....
; o' m9 ]' C& Z! K2 L V* @, Z/ F! V j$ t6 T J0 }4 _
其二是,包文件主体中文件的存放顺序并不是按照文件名表中来的,( l5 j( p9 D. V s. e
举个例子,文件名表中,每个文件的内容是这样的:
0 T% V9 t6 B" c6 q( ]) f文件名长度 文件名 文件大小 偏移量
, P7 o6 P5 u6 _' g5 f/ M) N* l' |1 {
也就是说,偏移量才代表了该文件在包中的位置,偏移量最小的文件,就是主体中存放在最前面的,却不是文件名表中的第一个。5 x5 U9 b( ^6 A. U& t% r
* [( |4 b$ Q; D3 v2 T+ o这是很麻烦的一点。
5 h5 M A' G8 L: p6 [% F. p这样一来,打包的时候就不能按照文件名表中文件顺序来打包,而必须根据偏移量大小顺序来依次打包。
. L, W; C) G- |* [ M5 P2 o6 ]
) W1 q" X6 i4 M9 e这儿我用的方法是把每个文件的信息(文件名、大小、偏移)存放到一个结构数组中。
" a& [# `+ O7 b1 n4 ^" o然后对这个数组按照偏移量做个排序,然后按照排完的顺序依次打包。
' @( `, W! x5 K4 }3 a, b之前肥牛的图形打包器似乎用了数据库,不过我看不太懂delphi,也不懂数据库....
) \0 c9 b8 \1 B6 m6 g- ^9 I" n% y+ h3 t
目前还存在的问题是,这个打包器无法通用:7 v. u% q y3 h9 n" v2 }: r* ^2 \
) K5 U' @. `8 M0 n' w( x
因为文件数量比较大,考虑到排序算法的效率,我用了结构数组做Quicksort,而用数组的话,数组大小(即文件数量)就是确定的值了。如果要大小可变,那么似乎用链表比较合适,不过用链表做quicksort我搞不定....做insertionsort效率又比较低下....不知有没有高人有更好的办法
1 s% y* |5 b5 W
! W! S S7 c; h6 R: H不过实际要通用也很容易,之前解包出来后看一下文件数量% y; G7 \: r! e$ B
然后把代码开头 #define FILENUM 760 后面定义的数值改成文件数量,重新编译一下就行了。6 X9 @% p5 ^6 ] I% r
7 c) o" w/ d* q& j解包脚本,打包器,代码都在压缩包里,打包代码我写了不少注释,欢迎各位高手指正。
5 w; [% T5 Z& W. E7 \& F' P1 p. `
# D; v$ t2 V+ u7 {打包器使用方法,和解包后的文件放在同一文件夹下,命令提示符下输入 pack Filename/ s @5 V( s6 n
filename即要输出的包文件名 |