标题: LS11数据格式分析总结和完整解压缩代码
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-14 08:42 资料 短消息 看全部作者
LS11数据格式分析总结和完整解压缩代码

最后更新 2010-04-16,文档版本 0.2

虽然前面已经有几大高手讨论过了,但是系统、完整一点的文献好像还没看到。直接可用的、完整的源代码也不多。这里在前人的基础上写了一些关于LS11的详细内容,并给出了完整的可执行程序和源代码,希望能对需要的人有所帮助。

由于排版方面的原因,直接贴到论坛上不是很方便,于是将详细的正文附在了附件的PDF文档中,需要的可以直接打开浏览。由于在下写作水平低陋,而且对van和Maxwell等人的原帖理解有限,所以烦请各位在检阅之余,还帮忙找找文中的谬误,我及时修正,以免误导。

附件还包括一个简陋的解压缩程序,并附上了完整的C语言源代码。相信有编程能力的人很容易将其改成更强大的程序。源代码中的解码函数参考了Maxwell的部分算法,未得到Maxwell的允许便写进了程序,希望Maxwell海涵。

如果您发现本文中的文字或者程序冒犯了您的版权,请通知我,我立刻修改或者删除。


附正文摘要:

LS11格式的数据文件存在于KOEI®开发的许多经典游戏中,比如大航海时代系列和三国志系列等等。本文在前人的基础上对LS11的详细格式进行了探讨,总结并阐述了LS11文件的具体格式,数据压缩方法,还原算法等等。并给出了完整的解压缩程序和源代码。



详情还是请见附件吧!

[ 本帖最后由 numdisp 于 2010-4-17 12:10 编辑 ]


附件: [数据分析PDF文档] ls11dec_document.zip (2010-4-17 12:10, 219.27 K)
该附件被下载次数 1400


附件: [程序实现及源代码] ls11dec_program.zip (2010-4-14 08:42, 56.29 K)
该附件被下载次数 612

本帖最近评分记录
Maxwell 2010-4-25 12:38 +200 代码和文档都看了。代码风格不错,从代码看作者软件开发经验丰富,向作者学习。
岱瀛 2010-4-23 23:14 +1 文档打不开,代码看了,先表扬一下,写出压缩程序再加推荐。
岱瀛 2010-4-23 23:14 +200 文档打不开,代码看了,先表扬一下,写出压缩程序再加推荐。


顶部
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-14 08:45 资料 短消息 看全部作者
0.2版的文档加上了致谢.


--

原文中忘了加上致谢,这里补上:

除了感谢van、maxwell、和gameplore等人精辟的讨论之外,还要特别感谢阿尔法孝直验证我的解压程序。
谢谢。

[ 本帖最后由 numdisp 于 2010-4-20 02:24 编辑 ]


顶部
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-14 23:16 资料 短消息 看全部作者
刚又随便检查了一下,发现了不少笔误,这里纠正一下。原帖中的文件已替换为修定后的版本。

第5页的表格,索引项最后一项值应为255,而不是256。
第6页,第6行,“继续读取8个数”,应为“继续读取8个数”,接着的“为1”应为“为2”,后面的公式中也应为 nc = 2 + C
第6页,第四小节倒数第二段:“从上面的复制过程可以看出,....”一句中,“当然”一词应为“当”。
还是第6页,第四小节最后描述复制过程的段落,“复制完成后,继续读取下一个数,为2”一行应该删除(这个错误太大了!)。
第7页,最后一行,Endianness一词少拼了一个n
第8页程序授权许可增加了一句话。


2010-04-16更新:

把原文中的“掩码”和“因子”的概念互换了。
致谢部分写入了正文。
修正了许多错别字。
增加了页码。
文档版本更新为0.2


再发现谬误会继续在本帖补上。

[ 本帖最后由 numdisp 于 2010-4-17 12:12 编辑 ]
顶部
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-15 06:48 资料 短消息 看全部作者
发现了一些问题

哪位能正确地解压缩附件中的这个LS11文件?

我的程序中有一段代码是判断文件是否合符预想中的LS11规范的,其中一条判断准则就是:

假设待解压的文件总长度为 TLEN,文件中含有 N 段压缩数据, 每段压缩数据的长度分别为 L(i), (i = 1 ~ N)。 那么,按照文中的分析,上述几个变量应满足以下等式:

16 + 256 + N*12 + 4 + SUM( L(i) ) = TLEN    (其中SUM 代表求和)

我试验了大部分LS11文件,的确满足上述关系。可是附件中的这个文件却是个例外。这个文件的体积远超出了预定的大小,不满足上述关系式。这个文件是我从PC版的大航海时代2这个游戏中摘出来的,应该是合法的LS11文件。

初步猜测以前描述的LS11文件格式并不完全,应该还有些尚未挖掘出来的信息。请高手帮忙看看。


附件: [一个特殊的LS11文件] KAO.zip (2010-4-15 06:48, 335.8 K)
该附件被下载次数 273
顶部
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-15 09:39 资料 短消息 看全部作者
回复 #8 阿尔法孝直 的帖子

其实我就是为了大航海2才干这个事的,van的RPGViewer要是支持大航海2我就不会自己研究LS11了。
顶部
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-20 02:23 资料 短消息 看全部作者
俺水平有限,压缩代码现在暂时还没整出来。
Maxwell的帖子里似乎有(gameplore的程序),不过我没用过。
顶部
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-23 13:18 资料 短消息 看全部作者
回复 #12 比古清十郎 的帖子

理论上讲,压缩要做的事情要比解压缩多。这段时间太忙,暂时没时间弄了。等有空再说吧。

不过,如果看懂了上面的文档,再结合Maxwell, gameplore等人的讨论仔细研究一下应该也是比较容易实现相应的压缩程序的。
顶部
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-25 12:38 资料 短消息 看全部作者
回复 #15 GOODCHAOGEGOOD 的帖子

我的程序中,如果去掉根据文件大小来判断合法性的准则的话,也是可以解开的,就是不知道后面多出来的信息是什么。
这个其实也不难,上面贴的KAO.LZW里面应该都是一些图片。解开后研究一下存储方式就知道了。
不过这段时间实在是无暇顾及了,好多事情,再不交成果,老板就....

另外,既然大侠有解压和压缩一体的程序,何不发上来让前面那位仁兄了却一桩心愿?
顶部
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-25 12:42 资料 短消息 看全部作者
Maxwell版大也出来了,你说的解压程序我没找着啊,可否贴一个链接?不过上面的GOODCHAOGEGOOD的程序看起来也很强啊。
另外,何以见得俺是 “*nix派”?就凭源码里多了个emacs的模式注释?
悄悄的说,其实我是两面派,
顶部
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-25 12:46 资料 短消息 看全部作者
回复 #20 比古清十郎 的帖子

请问程序链接在哪儿?麻烦贴一个让我也收藏一下。
顶部
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-25 12:51 资料 短消息 看全部作者
回复 #22 比古清十郎 的帖子

我土星了,居然没看新帖~~,上面对GOODCHAOGEGOOD说的全部作废。话说有源码么?(我太无耻了。)

[ 本帖最后由 numdisp 于 2010-4-25 12:53 编辑 ]
顶部
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-25 13:07 资料 短消息 看全部作者
回复 #25 Maxwell 的帖子

让版大见笑了,其实俺是纯业余的不过平常工作经常需要Windows/Linux两边倒腾,所以代码干脆全部*nix换行风格了,免得老是要dos2unix的转换。我写C的程序全是*nix风格,不过如果是GUI,又是C++的话,就全是MS风格了。文档的话,虽然看起来煞有其事,其实一读就知道写的很烂了。

另外,除了这段时间出现的LS11相关贴外,前面的似乎就只有我文档里提到的两个帖子了,而且年代比较久远了。压缩方面,前面的帖子的确是有讨论过,就是你和gameplore等人一起讨论了很多的那个超长贴,精华区的文献我也看了,想必实现不会很难,只是目前业余时间实在有限,没办法仔细研究了。等日后有空了再继续吧。不过GOODCHAOGEGOOD发的那个程序如果有源码的话就太好了。

[ 本帖最后由 numdisp 于 2010-4-25 13:08 编辑 ]
顶部
性别:男-离线 numdisp
(数值频散)

Rank: 1
组别 百姓
级别 在野武将
功绩 1
帖子 44
编号 362758
注册 2010-2-26


发表于 2010-4-25 13:56 资料 短消息 看全部作者
回复 #27 Maxwell 的帖子

你贴的这个链接就是我前面说的“精华区中的帖子”。由于我研究LS11的目的只在解压部分,所以对这个帖子以前只是粗略的看过,没有仔细消化。不过你的帖子里的代码已经很详细了,我想稍微花点功夫实现完整的压缩程序应该很简单了。

算啦,再这样回帖的话有版聊的嫌疑了,闪人吧。改日再会。
顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2025-7-21 22:30
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.012306 second(s), 11 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP