名称: CaramelBox 描述: 封包: .bin .dat 作者: 痴漢公賊 (glanser@163.com) 版本: 0.8.0 成熟度: 开发版 【TODO】 ·类型1和3的资源解析。 【lz资源文件格式说明】 类型是无目录的资源文件。 元数据是$$$、scb(二进制脚本)、anb等。 概述:lz文件分2部分-首部和1个或多个压缩数据块。首部记录了解压后的总长度;每个压缩块最前面放有一个压缩块头,记录了该块解压后的长度。所有数据块解压后的长度和应该等于首部中记录的解压后的总长度。 首部: s8 magic[2]; // "lz"标识,表示文件起始 u32 total_uncomprlen; // 总解压后的长度(be32) 压缩块头:紧接在文件头后面 s8 sync[2]; // "ze"标识,表示压缩块起始 u16 uncomprlen; // 当前块解压后的长度(be16) 压缩数据:紧接在文件头后面,采用位变长编码:用N个值为0的位表示值L的位数,接下来的N+1位是值L的实际值: 00000000............0000000XXX..................XXX |-- N位0,表示值L的位数 --||-- L的值,占用N+1位 --| ·值L的实际意义根据需要分为3种: 直接输出的字节数B(需要减1)、待输出的数据在过去输出缓冲区中的位置O以及从这个位置开始输出的字节数C。 ·解压缩时按下面4个步骤进行: 1. 获得直接输出的字节数B,然后按照该字节数B对应的位数(乘8)从压缩流中读取并直接输出。 2. 获得待输出的数据在过去输出缓冲区中的位置O。 3. 获得待输出的数据的字节数C。 4. 从输出缓冲区的位置O处输出C字节。 当输出的总字节数小于当前块的解压长度时,重复上面4个步骤; 当输出的总字节数等于当前块的解压长度时,表示当前块解压缩完毕。然后重新读取压缩块头,如果压缩流没有结束的话,就重新初始化解压器,再重复上面4个步骤。 解压器需要维护待使用的最多16位压缩数据。每当解压器维护的数据位数不足时,就读取2字节压缩数据,转换为little endian格式,并缓存起来。 【ChangeLog】 2009-03-28 20:53 ver 0.8.0 支持ARC4类型的封包提取;支持.fcb和.map资源的提取 2008-03-01 17:01 ver 0.7.0 支持lz类型的资源提取 2008-02-15 18:20 ver 0.6.0 第一版发布