【问题标题】:LZO Compression - How set the destination length?LZO 压缩 - 如何设置目标长度?
【发布时间】:2018-03-06 18:42:47
【问题描述】:

我正在尝试使用 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 将与缓冲区的大小相同。如何仅将压缩数据保存在 OutputFile 上? 提前致谢。

【问题讨论】:

  • 考虑使用外部 dll 的替代方案。参见例如我们的SynLz 单元,压缩速度更快,比率稍好,在单个单元中具有优化的 asm 或 pascal 源。如果您想要一些标准的、具有高压缩比的东西,请考虑使用SynLizard,它有多种操作模式,并且优于大多数其他算法(它是 LZ4 的继任者)——它需要一个带有 Delphi 的 dll,但可以静态链接到 FPC。
  • 谢谢,但我的工具的目的要求使用 lzo2a 算法压缩文件,这些替代方案基于 lzo1x 算法。
  • LZO 是 1990 年代的!网上有Delphi的静态链接LZO。如果你想摆脱 dll,也可以考虑编译和链接 .obj 文件。
  • 压缩后的文件会被第三方工具读取,需要用lzo2a算法压缩才能工作。不幸的是,我没有足够的技能将 dll 源代码编译成 .obj 文件以在我的项目中使用。有链接吗?

标签: delphi compression lzo


【解决方案1】:

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

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

【讨论】:

  • 我以为是输入参数,实际上是输出参数。现在正在工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多