这个,那个,这个任务似乎我拖了很久了= =.....先说声抱歉....! l# \/ ]7 O* E9 B& u: n# B+ U. N
/ E4 Y U6 f* @8 ~$ c$ H
其实代码很早之前就写了,不过之前调试一直通不过,后来又是复习又是考试的就一直耽搁了...
l" s7 p! J) d$ X' Q* D' y
8 @' d* ^1 y) j# l6 I2 a这周末有点空闲,于是狠下心重写了下代码,搞了两天,终于完成了..
3 w' X0 ?1 G" c- |: N8 ^6 u1 p( F V# E' o: v7 t( r) b& }; s
BF的文件格式虽然简单,打包器却不是太好做,我觉得还是有必要写写的" G/ \9 |3 J: @8 L; C# t4 p6 |
9 F- @8 I3 T% D1 ~# z' G5 U4 KBF格式有两个特点:
( T) T9 `; ]9 k' V6 k其一是文件表的递归存放,这个不算难,Quickbms也可以用
1 y( [. X& m" Q& n! z: t9 }; UStart Function XX
4 Q1 Z( o1 f n# VEnd Function XX* j0 [0 G$ J& s$ {$ F
Call Function XX
8 U j! S% R$ Y0 m来做递归,不过输出读入时文件名前面要加上目录名和/,还是有点小麻烦....: K! P" G; j) F& @
( W7 t+ S' i+ U: [2 N6 e
其二是,包文件主体中文件的存放顺序并不是按照文件名表中来的,
/ ^9 i! Q8 l$ m举个例子,文件名表中,每个文件的内容是这样的:
0 c/ L! e, w( E; |1 e9 C6 E9 G9 Z文件名长度 文件名 文件大小 偏移量+ ^" m1 s4 @$ R6 @1 d* \7 V
0 Y u: j, N {也就是说,偏移量才代表了该文件在包中的位置,偏移量最小的文件,就是主体中存放在最前面的,却不是文件名表中的第一个。
! f* F+ R# t: B, f7 J7 M5 c( r1 K1 j5 _7 E9 u
这是很麻烦的一点。
: s" H t4 X- f这样一来,打包的时候就不能按照文件名表中文件顺序来打包,而必须根据偏移量大小顺序来依次打包。
0 S1 v6 ~0 `0 Y4 E% r$ W1 U6 o Z; k+ V9 s x% ?
这儿我用的方法是把每个文件的信息(文件名、大小、偏移)存放到一个结构数组中。8 j6 v( M1 i( O
然后对这个数组按照偏移量做个排序,然后按照排完的顺序依次打包。
/ j5 {% f6 p- S1 x5 `# N之前肥牛的图形打包器似乎用了数据库,不过我看不太懂delphi,也不懂数据库....1 W) F# y0 o4 ?+ q- [) ?- _
[* K3 m p" ^9 ^ ?* M目前还存在的问题是,这个打包器无法通用:( A6 b2 ~) O( O. I, l& j" e4 n
2 x( e& D6 N& ~: M: F因为文件数量比较大,考虑到排序算法的效率,我用了结构数组做Quicksort,而用数组的话,数组大小(即文件数量)就是确定的值了。如果要大小可变,那么似乎用链表比较合适,不过用链表做quicksort我搞不定....做insertionsort效率又比较低下....不知有没有高人有更好的办法
4 }2 I) |4 {5 G5 X' n/ d! r1 G' ^) Q, F$ V g) b4 `# e& G
不过实际要通用也很容易,之前解包出来后看一下文件数量' \; N! H- U b: h- {
然后把代码开头 #define FILENUM 760 后面定义的数值改成文件数量,重新编译一下就行了。2 A- L: \7 ^+ s7 Y( y( b' }2 e
: f* I# f( Y5 L. Q$ K7 C解包脚本,打包器,代码都在压缩包里,打包代码我写了不少注释,欢迎各位高手指正。' z' |) i5 h: N9 y( W* K- E
' \! @. ^9 }1 A' C: X5 [( P; ]打包器使用方法,和解包后的文件放在同一文件夹下,命令提示符下输入 pack Filename
% n: h9 j7 K# |+ R; g2 s! F. h' a" Vfilename即要输出的包文件名 |