如何解决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 举报,一经查实,本站将立刻删除。