以上是mobi格式压缩解压abc,实际文件还有其它图片、中文索引等内容的压缩,就没有办法分析了。
用delphi编写的解码程序如下代码:
begin //开始逐字读入压缩的mobi,假定变量和函数已定义;
counter:=0; //计数器;
j:=0; //读数器;
tm.Position:=0; //tm=TMemoryStream; 动态分配的内存且已经读入mobi文件;
while (j<size-2) do //size 为文件长度,可以根据文件索引调整起始位置;
begin
tm.Read(rd1,1); //读入一个字符;
inc(j);
fm.Seek(counter,0); // 定位指针要时而往前,时而往后,因此在读入每个字符时重新定位;
case rd1 of //简单地用一个case分别处理不同情况;
$80..$bf: //美元符号表示16进制数;仅初步判断到的可能大致分界。(压缩设计者会把所有能利用的空间想办法用足);
begin
tm.Position:=tm.Position-1;
tm.Read(bw,2);
bw:=swap(bw) and $7fff;
sm1:=CountTrace(bw)+3;
writeMem(sm1);
inc(j);
end;
$1..$0f:
for i:=0 to rd1-1 do
begin
tm.Read(rd2,1);
inc(j);
fm.Write(rd2,1);
inc(counter);
end;
$c0..$ff:
begin
c:=$20;
fm.Write(c,1);
inc(counter);
c:=rd1 and $7f;
fm.Write(c,1);
inc(counter);
end;
$0: inc(counter);
else
fm.Write(rd1,1);
inc(counter);
end;
end;
fm.Position:=0;
outstream.CopyFrom(fm,counter-1);
fm.Free;
tm.Free;
end;
以上程序在delphi7.0 编译通过。
原文地址:http://blog.csdn.net/wwjianlao/article/details/41783901