Я хочу распаковать необработанный поток LZ4 внутри двоичных данных. Я прочитал документацию и придумал следующую функцию. Согласно коду, он должен продолжать распаковывать до тех пор, пока не закончатся сжатые данные, но этого не происходит. Что я делаю неправильно? Кроме того, я хочу добавить запись для сжатого размера.
function Try(inStream: TMemorySTream): Boolean;
var
i, j, k: int64;
orig_buff: Pansichar;
compressed_buff: Pansichar;
lz4StreamDecode: PLZ4_streamDecode_t;
begin
result := false;
lz4StreamDecode := LZ4_createStreamDecode();
k := 0;
while True do
begin
orig_buff := allocmem(100);
compressed_buff := allocmem(4064);
j := inStream.Read(orig_buff^, 100);
i := lz4.LZ4_decompress_safe_continue(lz4StreamDecode, orig_buff,
compressed_buff, j, 4064);
Freemem(orig_buff);
Freemem(compressed_buff);
if i <= 0 then
break;
inc(k);
end;
if k <> 0 then
result := True;
LZ4_freeStreamDecode(lz4StreamDecode);
end;
РЕДАКТИРОВАТЬ 1: Удалена часть, где освобождается выходной буфер (временный буфер), но проблема остается, вместо распаковки всего потока и последующего выхода, он просто заранее выходит из цикла.
function Try(inStream: TMemorySTream): Boolean;
var
i, j, k: int64;
orig_buff: Pansichar;
compressed_buff: Pansichar;
lz4StreamDecode: PLZ4_streamDecode_t;
begin
result := false;
lz4StreamDecode := LZ4_createStreamDecode();
compressed_buff := allocmem(64 * 1024 * 1024);
k := 0;
while True do
begin
orig_buff := allocmem(100);
j := inStream.Read(orig_buff^, 100);
i := lz4.LZ4_decompress_safe_continue(lz4StreamDecode, orig_buff,
compressed_buff, j, (64 * 1024 * 1024));
Freemem(orig_buff);
if i <= 0 then
break;
inc(k);
end;
if k <> 0 then
result := True;
Freemem(compressed_buff);
LZ4_freeStreamDecode(lz4StreamDecode);
end;