📄 unpack.pas
字号:
unit Unpack;
interface
procedure DecompressBuff(const InBuff: Pointer; InBytes: Integer;
const OutBuff: Pointer; BufSize: Integer);
implementation
const
zlib_version = '1.0.4';
type
TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; register;
TFree = procedure (AppData, Block: Pointer); register;
TZStreamRec = packed record
next_in: PChar;
avail_in: Integer;
total_in: Integer;
next_out: PChar;
avail_out: Integer;
total_out: Integer;
msg: PChar;
internal: Pointer;
zalloc: TAlloc;
zfree: TFree;
AppData: Pointer;
data_type: Integer;
adler: Integer;
reserved: Integer;
end;
{$L obj\inflate.obj}
{$L obj\inftrees.obj}
{$L obj\adler32.obj}
{$L obj\infblock.obj}
{$L obj\infcodes.obj}
{$L obj\infutil.obj}
{$L obj\inffast.obj}
procedure adler32; external;
procedure inflate_trees_bits; external;
procedure inflate_trees_dynamic; external;
procedure inflate_trees_fixed; external;
procedure inflate_trees_free; external;
procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl;
begin
FillChar(P^, count, B);
end;
procedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
begin
Move(source^, dest^, count);
end;
function inflateInit_(var strm: TZStreamRec; version: PChar;
recsize: Integer): Integer; external;
function inflate(var strm: TZStreamRec; flush: Integer): Integer; external;
function inflateEnd(var strm: TZStreamRec): Integer; external;
function inflateReset(var strm: TZStreamRec): Integer; external;
function AllocMem(Size: Cardinal): Pointer;
begin
GetMem(Result, Size);
FillChar(Result^, Size, 0);
end;
function zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; register;
begin
Result:= AllocMem(Items * Size);
end;
procedure zlibFreeMem(AppData, Block: Pointer); register;
begin
FreeMem(Block);
end;
procedure DecompressBuff(const InBuff: Pointer; InBytes: Integer;
const OutBuff: Pointer; BufSize: Integer);
var
strm: TZStreamRec;
begin
FillChar(strm, SizeOf(strm), 0);
strm.zalloc:= zlibAllocMem;
strm.zfree:= zlibFreeMem;
strm.next_in:= InBuff;
strm.avail_in:= InBytes;
strm.next_out:= OutBuff;
strm.avail_out:= BufSize;
inflateInit_(strm, zlib_version, SizeOf(strm));
try
inflate(strm, 4);
finally
inflateEnd(strm);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -