【发布时间】: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 上? 提前致谢。
【问题讨论】:
-
谢谢,但我的工具的目的要求使用 lzo2a 算法压缩文件,这些替代方案基于 lzo1x 算法。
-
LZO 是 1990 年代的!网上有Delphi的静态链接LZO。如果你想摆脱 dll,也可以考虑编译和链接 .obj 文件。
-
压缩后的文件会被第三方工具读取,需要用lzo2a算法压缩才能工作。不幸的是,我没有足够的技能将 dll 源代码编译成 .obj 文件以在我的项目中使用。有链接吗?
标签: delphi compression lzo