Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 理解这种基于LZSS的解压缩算法_C_Compression_Lz77 - Fatal编程技术网

C 理解这种基于LZSS的解压缩算法

C 理解这种基于LZSS的解压缩算法,c,compression,lz77,C,Compression,Lz77,我想了解这个基于LZSS的算法,以便编写一个压缩器(也许是一个更好的解压器),我正在研究LZ77和LZSS,但有几行我仍然没有得到 我尽可能多地注释了下面的代码,第一个注释块不是我做的,它解释了标题 // //ULZ头文件(20字节) // --------------------- //0x0000-4字节:签名“ULZ”+0x1A //0x0004-2个字节:0 //0x0006-1字节:模式?(2/正常LZ,0/未知LZ类型) //0x0007-1字节:LZ算法的nbits //0x000

我想了解这个基于LZSS的算法,以便编写一个压缩器(也许是一个更好的解压器),我正在研究LZ77和LZSS,但有几行我仍然没有得到

我尽可能多地注释了下面的代码,第一个注释块不是我做的,它解释了标题

//
//ULZ头文件(20字节)
// ---------------------
//0x0000-4字节:签名“ULZ”+0x1A
//0x0004-2个字节:0
//0x0006-1字节:模式?(2/正常LZ,0/未知LZ类型)
//0x0007-1字节:LZ算法的nbits
//0x0008-4字节:解压缩数据的偏移量(与32位对齐)
//0x000C-4字节:压缩数据的偏移量(与32位对齐)
//0x0010-4字节:解压缩文件的大小
//
//ULZ主体(与32位对齐)
// -----------------------------
//0x0014-X字节:标记数据
// ?????? - X字节:解压缩数据(指针位于0x0008中)
// ?????? - X字节:压缩数据(指针为0x000C)
//
//在:
//source-ULZ缓冲区(带标头的有效ULZ文件)
//target-解压缩数据的数据缓冲区
//输出:
//0-解压正常
//1-解压缩失败
int UnULZ(无符号字符*源,无符号字符*目标){
无符号字符*ulz_f、*ulz_d、*ulz_c、*tgt、*end;
无符号整数长度、pos、nbits、msk;
无符号字符标志,掩码;
如果(源[0x06]!=0x02){
如果(调试)printf(“不支持模式%02X”,源[0x06]);
申报表(1);
}
//顶部的注释块显示“对于LZ算法”
//这个整数稍后用于shift,首先是如何计算的?
nbits=源[0x07];
//为什么要将0xffff除以16个nbits?nbits应该至少为16吗?
msk=0xFFFF>>(16-nbits);
//读取第一个标志字节
ulz_f=源+0x14;
//指向第一个解压缩的数据
ulz_d=源+*(无符号整数*)(源+0x08);
//压缩数据从哪里开始
ulz_c=源+*(无符号整数*)(源+0x0C);
//目标缓冲区
tgt=目标;
//格式告诉我们最终的尺寸
end=target+*(unsigned int*)(source+0x10);

对于(mask=0;tgtnbits
long。
msk = 0xFFFF >> (16 - nbits);
pos = *ulz_c++;
pos |= *ulz_c++ << 8;

len = (pos >> nbits) + 2;
pos = (pos & msk) + 1;