RednaxelaFX 发表于 2013-2-4 22:10:04

BattleMoonWars 归档解压/压缩程序(砍掉重炼版)

以前写过BattleMoonWars的归档处理程序。可惜在JavaEye上的老帖里的代码真的非常老了;那代码我后来改过几次的,修掉以前偷懒不支持多层目录的问题,还修过对应LZSS解压的问题(但一直偷懒没实现压缩……用Java来写LZSS压缩真痛苦)。
改过的版本老早就不知道哪儿去了。茶茶也找不到那代码了,但要发新的BMW完全版的汉化补丁又等着用这打包工具……拖到今天终于重新写了个。

以前那个是用Java写的,这次用Ruby来试试。目标是用干净的代码实现归档处理程序需要的解包和打包功能,外带应用上LZSS的压缩。
写完之后,拿代码跟以前的Java版比较了一下,觉得自己貌似没啥长进。眯着眼睛看的话会觉得俩版本都差不多,至少“算法”都一样——这么小的东西根本没用上啥算法嘛orz
不过以前那版代码要想整理得干净一些的话显然是有许多办法的。印象中后来也没这么乱了,但,找不到了啊 T T
诶,用Java这么重量级的语言去实现这么简单的小工具本身就是个杯具。要是当年我就熟悉什么脚本语言的话……

Ruby的代码还是比Java的显著的少了。我倒没特意要为了短而写短,反而有些地方还特意用了比较长的名字和有点冗余的运算,因为懒得写注释,代码本身就应该能体现意图。
代码能减少的一个原因在于Java的标准I/O API用起来不方便,而且默认用big endian,在我们这little endian的平台上用起来很是费事。就为了各种转换endian、在byte[]与别的数据类型间转换之类的地方就写了很多垃圾代码。
相比之下Ruby的I/O API用起来非常方便,而且靠强大的String#unpack与Array#pack就已经可以解决很多转换问题,所以读取索引项的代码Ruby版比Java版短很多。
另外,Java代码的“噪音”还是比较大。嵌套的a.setXxx(b.getXxx())这类代码自然比不上a.xxx = b.xxx来得清爽。

OK,又到大段贴代码时间。贴代码比放附件“安全”多了,回头Google Reader把这篇备份到了之后我就不怕代码丢失了 ha ha ha
这次用的Ruby版本是去年7月自己用VC9来build的1.9.2dev。
<div class="quote_title">引用
页: [1]
查看完整版本: BattleMoonWars 归档解压/压缩程序(砍掉重炼版)