微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

LZMA减压算法如何工作?

如何解决LZMA减压算法如何工作?

我坚持了解lzma解压缩算法的工作原理,更确切地说是该功能

int res = LzmaDec_DecodetoBuf(CLzmaDec *p,Byte *dest,SizeT *destLen,const Byte *src,SizeT *srcLen,ELzmaFinishMode finishMode);

处于无限循环中,具有固定大小的SizeT * destLen和SizeT * srcLen具有相等的大小,逻辑上destLen(未压缩数据)应大于srcLen(压缩数据)的预定义比例,我没有无法获得大小相等的工作原理,或者它可以接受任何大小,那么它会有一个临时的buff,它将先存储数据,然后用它的方法对其进行处理

解决方法

此功能确实很难使用。它是为增量减压而构建的。因此,设想的用例如下:

  • 程序从诸如文件的源中读取压缩数据。数据分块读取,例如一次1000个字节。
  • 每个块都被解压缩到缓冲区中。缓冲区通常较大,例如2000字节解压缩块后,目标缓冲区将部分填充数据,例如1738个字节。
  • 对于每个块,解压缩的数据将被进一步处理,例如写入文件。

因此,用于解压缩文件并将结果写入另一个文件的简化代码如下:


file_in = open_file(...);
file_out = open_file(...);
while (!eof(file_in)) {
   len_in = read(file_in,buf_in,1000);
   len_out = decompress(buf_in,len_in,buf_out,2000);
   write(file_out,len_out);
}
close(file_in);
close(file_out);

所以LzmaDec_DecodeToBuf的相关参数是:

  • dest:指向目标缓冲区的指针
  • destLen:指向目标长度的指针。调用方将长度设置为分配的缓冲区大小。 LzmaDec_DecodeToBuf更新长度以包含解压缩数据的长度。
  • src:指向源缓冲区的指针
  • srcLen:指向源长度的指针。调用方将长度设置为缓冲区中压缩数据的长度。 LzmaDec_DecodeToBuf更新长度以包含已处理的字节数。

srLen可能很棘手。在大多数情况下,将处理传递给该函数的所有数据。但是,如果解压缩后的数据不适合目标缓冲区,则它将仅处理部分数据。因此,需要将解压缩后的数据写入文件以释放目标缓冲区,并且需要使用剩余数据再次调用该函数。在简化代码中已将其省略。

另一个遗漏是最终确定。在输入文件的末尾,可能需要使用不同的完成方式最后一次调用LzmaDec_DecodeToBuf

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。