LZO压缩 - 如何设置目标长度?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LZO压缩 - 如何设置目标长度?相关的知识,希望对你有一定的参考价值。

我正在尝试使用lzo.dll压缩一些文件,我的代码(Delphi)是这样的:

function lzo2a_999_compress(const Source: Pointer; SourceLength: LongWord; Dest: Pointer; var DestLength: LongWord; WorkMem: Pointer): Integer; cdecl; external 'lzo.dll';
...
function LZO_compress(FileInput, FileOutput: String): Integer;
var
   FInput, FOutput: TMemoryStream;
   WorkMem: Pointer;
   Buffer: TBytes;
   OutputLength: LongWord;
begin
   FInput := TMemoryStream.Create;
   FOutput := TMemoryStream.Create;
   FInput.LoadFromFile(FileInput);
   FInput.Position := 0;
   GetMem(WorkMem, 1000000);
   OutputLength := ??!?!?!;
   SetLength(Buffer, OutputLength);
   try
      lzo2a_999_compress(FInput.Memory, FInput.Size, Buffer, OutputLength, WorkMem);
   finally
      FOutput.CopyFrom(Buffer, Length(Buffer));
   end;
   FOutput.SaveToFile(FileOutput);
   FreeMem(WorkMem, 1000000);
   FInput.Free;
   FOutput.Free;
end;
...

问题是:如何设置“OutputLength”?我可以为防止出现问题而调整大小,但FOutput的大小与Buffer相同。如何只在OutputFile上保存压缩数据?提前致谢。

答案

在函数调用之前,您不能(也不必)知道它。它是一个var参数,将由返回时的函数设置。然后,您可以使用OutputLength变量来知道要从缓冲区复制的字节数:

OutputLength := 0; // initialize only
...
try
  lzo2a_999_compress(FInput.Memory, FInput.Size, Buffer, OutputLength, WorkMem);
finally
  FOutput.CopyFrom(Buffer, OutputLength);

以上是关于LZO压缩 - 如何设置目标长度?的主要内容,如果未能解决你的问题,请参考以下文章

0003-如何在CDH中使用LZO压缩

如何在不使用 map reduce 的情况下使用 lzo 压缩写入 hadoop hdfs

HadoopLZO压缩配置

如何使用 LZO 以外的压缩处理 Hadoop Map/Reduce 中的协议缓冲区文件?

lzo文件压缩,解压

LZO 使用和介绍