Result := 3;
CurrentCh := FCurrent + 3;
if (CurrentCh <> FLookAheadEnd) then begin
while (Result < tdcLZMaxMatchLength) and (MatchStr^ = CurrentCh^ ) do
begin
inc(Result);
inc(MatchStr);
inc(CurrentCh);
if (CurrentCh = FLookAheadEnd) then
Break;
end;
end;
end;
procedure TtdLZSlidingWindow.GetNextSignature(var aMS : TtdLZSignature;
var aOffset : longint);
var
P : PAnsiChar;
i : integer;
begin
{Π²ΡΡΠΈΡΠ»ΠΈΡΡ Π΄Π»ΠΈΠ½Ρ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ; ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠ½Π° ΡΠ°Π²Π½Π° 3, Π½ΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°Π²Π½Π° 2 ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅.}
if ((FLookAheadEnd - FCurrent) < 3) then
aMS.AsString[0] := AnsiChar (FLookAheadEnd - FCurrent) else
aMS.AsString[0] := #3;
P := FCurrent;
for i := 1 to length (aMS.AsString) do
begin
aMS.AsString[i] := P^;
inc(P);
end;
aOffset := FStartOffset + (FCurrent - FStart);
end;
procedure TtdLZSlidingWindow.swReadFromStream;
var
BytesRead : longint;
BytesToRead : longint;
begin
{Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ Π² Π·ΠΎΠ½Ρ ΡΠΏΡΠ΅ΠΆΠ΄Π°ΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ°}
BytesToRead := FBufferEnd - FLookAheadEnd;
BytesRead := FStream.Read(FLookAheadEnd^, BytesToRead);
inc(FLookAheadEnd, BytesRead);
end;
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Π½Π°Ρ Π°ΡΡΠ΅Π½Π°Π» ΠΏΠΎΠΏΠΎΠ»Π½ΠΈΠ»ΡΡ ΡΡΠΈΠΌΠΈ ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠΆΠ°ΡΠΈΡ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 11.27. ΠΠ½Π° ΡΠ»Π΅Π³ΠΊΠ° ΠΎΡΠ»ΠΎΠΆΠ½ΡΠ΅ΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΡ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡΡ ΠΊΠΎΠ΄Ρ ΡΠΆΠ°ΡΠΈΡ ΠΏΠΎ Π²ΠΎΡΠ΅ΠΌΡ. ΠΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π²ΡΡΠΈΡΠ»ΠΈΡΡ Π±Π°ΠΉΡ ΡΠ»Π°Π³Π° Π΄Π»Ρ Π²ΡΠ΅Ρ Π²ΠΎΡΡΠΌΠΈ Π±Π°ΠΉΡΠΎΠ², Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π±Π°ΠΉΡ ΡΠ»Π°Π³Π°, Π·Π° ΠΊΠΎΡΠΎΡΡΠΌ ΡΠ»Π΅Π΄ΡΡΡ Π²ΠΎΡΠ΅ΠΌΡ ΠΊΠΎΠ΄ΠΎΠ². ΠΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ ΡΠ»ΡΠΆΠΈΡ ΠΌΠ°ΡΡΠΈΠ² Encodings. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΡΠ°ΠΌΠ° ΡΡΠ° ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ»ΠΎΠΆΠ½Π° Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ.
ΠΠΈΡΡΠΈΠ½Π³ 11.27. ΠΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ZL77
type
PEnumExtraData = ^TEnumExtraData; {Π·Π°ΠΏΠΈΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ }
TEnumExtraData = packed record { ΠΌΠ΅ΡΠΎΠ΄Π° FindAll Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΡ}
edSW : TtdLZSlidingWindow; {..ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π³ΠΎ ΠΎΠΊΠ½Π°}
edMaxLen : integer;{..ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π΄Π»ΠΈΠ½Π° ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡΠΈΡ }
{ΡΡΡΠΎΠΊ Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ}
edDistMaxMatch: integer;
end;
type
TEncoding = packed record
AsDistLen : cardinal;
AsChar : AnsiChar;
IsChar : boolean;
{ $IFNDEF Delphi1}
Filler : word;
{$ENDIF}
end;
TEncodingArray = packed record
eaData : array [0..7] of TEncoding;
eaCount: integer;
end;
procedure MatchLongest(aExtraData : pointer;
const aSignature : TtdLZSignature;
aOffset : longint);
far;
var
Len : integer;
Dist : integer;
begin
with PEnumExtraData(aExtraData)^ do
begin
Len :=edSW.Compare(aOffset, Dist);
if (Len > edMaxLen) then begin
edMaxLen := Len;
edDistMaxMatch := Distend;
end;
end;
procedure WriteEncodings(aStream : TSTream;
var aEncodings : TEncodingArray);
var
i : integer;
FlagByte : byte;
Mask : byte;
begin
{ΠΏΠΎΡΡΡΠΎΠΈΡΡ Π±Π°ΠΉΡ ΡΠ»Π°Π³Π° ΠΈ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π΅Π³ΠΎ Π² ΠΏΠΎΡΠΎΠΊ}
FlagByte := 0;
Mask :=1;
for i := 0 to pred(aEncodings.eaCount) do
begin
if not aEncodings.eaData[i].IsChar then
FlagByte := FlagByte or Mask;
Mask := Mask shl 1;
end;
aStream.WriteBuffer(FlagByte, sizeof(FlagByte));
{Π·Π°ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠ΄Ρ}
for i := 0 to pred(aEncodings.eaCount) do
begin
if aEncodings.eaData[i].IsChar then
aStream.WriteBuffer(aEncodings.eaData[i].AsChar, 1) else
aStream.WriteBuffer(aEncodings.eaData[i].AsDistLen, 2);
end;
aEncodings.eaCount := 0;
end;
procedure AddCharToEncodings(aStream : TStream;
aCh : AnsiChar;
var aEncodings : TEncodingArray);
begin
with aEncodings do
begin
eaData[eaCount].AsChar := aCh;
eaData[eaCount].IsChar := true;
inc(eaCount);
if (eaCount = 8) then
WriteEncodings(aStream, aEncodings);
end;
end;
procedure AddCodeToEncodings(aStream : TStream;
aDistance : integer;
aLength : integer;
var aEncodings : TEncodingArray);
begin
with aEncodings do
begin
eaData[eaCount].AsDistLen :=
(pred(aDistance) shl tdcLZDistanceShift) + (aLength - 3);
eaData[eaCount].IsChar := false;
inc(eaCount);
if (eaCount = 8) then
WriteEncodings(aStream, aEncodings);
end;
end;
procedure TDLZCompress(aInStream, aOutStream : TStream);
var
HashTable : TtdLZHashTable;
SlideWin : TtdLZSlidingWindow;
Signature : TtdLZSignature;
Offset : longint;
Encodings : TEncodingArray;
EnumData : TEnumExtraData;
LongValue : longint;
i : integer;
begin
HashTable :=nil;
SlideWin := nil;
try
HashTable := TtdLZHashTable.Create;
HashTable.Name := 'LZ77 Compression hash table';
SlideWin := TtdLZSlidingWindow.Create(aInStream, true);
SlideWin.Name := 'LZ77 Compression sliding window';
{Π·Π°ΠΏΠΈΡΠ°ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π² ΠΏΠΎΡΠΎΠΊ: 'TDLZ', Π·Π° ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π΅ΡΠΆΠ°ΡΠΎΠ³ΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°}
LongValue := TDLZHeader;
aOutStream.WrijteBuffer(LongValue, sizeof(LongValue));
LongValue aInStream.Size;
aOutStream.WriteBuffer(LongValue, sizeof(LongValue));
{ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΊ ΡΠΆΠ°ΡΠΈΡ}
Encodings.eaCount := 0;
EnumData.edSW := SlideWin;
{ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠ΅ΡΠ²ΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΡ}
SlideWin.GetNextSignature(Signature, Offset);
{Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π΄Π»ΠΈΠ½Π° ΡΠΈΠ³Π½Π°ΡΡΡΡ ΡΠ°Π²Π½Π° ΡΡΠ΅ΠΌ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌ...}
while ( length ( Signature.AsString) = 3 ) do
begin
{Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΠΎΠΈΡΠΊ Π² ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅ΠΌ ΠΎΠΊΠ½Π΅ ΡΠ°ΠΌΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΡ Π΄Π»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΉ}
EnumData.edMaxLen := 0;
if HashTable.EnumMatches(Signature,
Offset - tdcLZSlidingWindowSize, MatchLongest, @EnumData) then begin
{ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΏΠΎ ΠΌΠ΅Π½ΡΡΠ΅ΠΉ ΠΌΠ΅ΡΠ΅ ΠΎΠ΄Π½ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ : Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΏΠ°ΡΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅/Π΄Π»ΠΈΠ½Π° ΡΠ°ΠΌΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈ ΡΠ΄Π²ΠΈΠ½ΡΡΡ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π΅ ΠΎΠΊΠ½ΠΎ Π½Π° ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅, ΡΠ°Π²Π½ΠΎΠ΅ ΡΡΠΎΠΉ Π΄Π»ΠΈΠ½Π΅}
AddCodeToEncodings(aOutStream,
EnumData.edDistMaxMatch, EnumData.edMaxLen, Encodings);
SlideWin.Advance(EnumData.edMaxLen);
end
else begin
{ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ: Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΈ ΡΠ΄Π²ΠΈΠ½ΡΡΡ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π΅ ΠΎΠΊΠ½ΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΌΠ²ΠΎΠ»}
AddCharToEncodings(aOutStream,
Signature.AsString[1], Encodings);
SlideWin.Advance(1);
end;
{Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΡ Π² Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΡ}
HashTable.Insert(Signature, Offset);
{ΠΈΠ·Π²Π»Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΡ}
SlideWin.GetNextSignature(Signature, Offset);
end;
{Π΅ΡΠ»ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠ°Π»Π° Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΈΡ Π½ΡΠΆΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄Ρ Π»ΠΈΡΠ΅ΡΠ°Π»ΡΠ½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²}
if (length(Signature.AsString) > 0) then begin
for i := 1 to length (Signature.AsString) do AddCharToEncodings(aOutStream,
Signature.AsString[i], Encodings);
end;
{ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π·Π°ΠΏΠΈΡΡ Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΊΠΎΠ΄ΠΎΠ²}
if (Encodings.eaCount > 0) then
WriteEncodings(aOutStream, Encodings);
finally SlideWin.Free;
HashTable.Free;
end; {try.. finally}
end;
ΠΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΆΠ°ΡΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. ΠΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΡ ΠΈ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π΅ ΠΎΠΊΠ½ΠΎ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΌΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π² Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠΈΠ³Π½Π°ΡΡΡΡ, Π·Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ Π½Π΅ΡΠΆΠ°ΡΡΡ Π΄Π°Π½Π½ΡΡ . ΠΠ°ΡΠ΅ΠΌ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π²Ρ ΠΎΠ΄ Π² ΡΠΈΠΊΠ». ΠΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΈΠΊΠ»Π° ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ΅ΠΊΡΡΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΡ ΠΈ ΠΏΡΡΠ°Π΅ΠΌΡΡ ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π΅Π΅ Ρ ΡΠ΅ΠΌ-Π»ΠΈΠ±ΠΎ ΡΠΆΠ΅ Π²ΡΡΡΠ΅ΡΠ°Π²ΡΠΈΠΌΡΡ ΡΠ°Π½Π΅Π΅ (Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ EnumMatches Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΡ). ΠΡΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ ΠΎΡΡΡΡΡΡΠ²ΡΡΡ, Π»ΠΈΡΠ΅ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ Π² ΠΌΠ°ΡΡΠΈΠ² ΠΊΠΎΠ΄ΠΎΠ² ΠΈ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π΅ ΠΎΠΊΠ½ΠΎ ΡΠ΄Π²ΠΈΠ³Π°Π΅ΡΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΌΠ²ΠΎΠ». Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π² ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π΅ ΠΎΠΊΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΠΏΠ°ΡΠ° ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅/Π΄Π»ΠΈΠ½Π°, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ°Ρ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠ΅, ΠΈ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π΅ ΠΎΠΊΠ½ΠΎ ΡΠ΄Π²ΠΈΠ³Π°Π΅ΡΡΡ Π½Π° ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅, ΡΠ°Π²Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Ρ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ².
ΠΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠΆΠ°ΡΠΈΡ LZ77 ΡΠ°Π·Π±ΠΈΡ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²: TDLZBase.pas ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠΈΡ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ, TDLZHash.pas ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΡ, TDLZSWin - ΠΊΠ»Π°ΡΡ ΡΠΊΠΎΠ»ΡΠ·ΡΡΠ΅Π³ΠΎ ΠΎΠΊΠ½Π°, Π° TDLZCmpr.pas - ΠΊΠΎΠ΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΆΠ°ΡΠΈΡ ΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ. ΠΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π½Π° web-ΡΠ°ΠΉΡΠ΅ ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΡΡΠ²Π°, Π² ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠ².
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠ»ΠΈΡΡ Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΆΠ°ΡΠΈΡ ΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ LZ77, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠ΅Π½ΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² ΡΠΆΠ°ΡΠΈΡ. ΠΡΠ»ΠΈ Π±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠΆΠ°ΡΡ Π²ΡΠ΅ 10 Π±Π°ΠΉΡΠΎΠ²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π² ΡΠ°ΠΉΠ»Π΅ Π΄ΠΎ 2 Π±Π°ΠΉΡ - ΠΈΠ½Π°ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ - Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΡΡ 80 Π±Π°ΠΉΡΠΎΠ² ΡΠ°ΠΉΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΠΏΠΎ 17 Π±Π°ΠΉΡ (ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ ΡΠ»Π°Π³Π° ΠΈ Π²ΠΎΡΠ΅ΠΌΡ 2-Π±Π°ΠΉΡΠΎΠ²ΡΡ ΠΊΠΎΠ΄ΠΎΠ²). Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ ΡΠΆΠ°ΡΠΈΡ ΡΠ°Π²Π½ΡΠ»ΡΡ Π±Ρ 79 ΠΏΡΠΎΡΠ΅Π½ΡΠ°ΠΌ. Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π΅ΡΠ»ΠΈ Π±Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ Π² ΡΠ°ΠΉΠ»Π΅ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ Π±Ρ Π½Π°ΠΉΡΠΈ, Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΡΡ Π²ΠΎΡΡΠΌΠΈ Π±Π°ΠΉΡΠΎΠ² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΠΏΠΎ Π΄Π΅Π²ΡΡΡ Π±Π°ΠΉΡΠΎΠ². Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ ΡΠΆΠ°ΡΠΈΡ ΡΠΎΡΡΠ°Π²ΠΈΠ» Π±Ρ -13 ΠΏΡΠΎΡΠ΅Π½ΡΠΎΠ². Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΠΆΠ°ΡΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ ΡΠΆΠ°ΡΠΈΡ, Π»Π΅ΠΆΠ°ΡΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΌΠΈ ΠΊΡΠ°ΠΉΠ½ΠΈΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ.
Π Π΅Π·ΡΠΌΠ΅
Π ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ ΠΏΡΠΎΠ²Π΅Π»ΠΈ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠΆΠ°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ . ΠΡ Π½Π°ΡΠ°Π»ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ Ρ Π΄Π²ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ·Π±ΡΡΠΎΡΠ½ΠΎΡΡΡΡ: ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π¨Π΅Π½Π½ΠΎΠ½Π°-Π€Π°Π½ΠΎ ΠΈ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π₯Π°ΡΡΠΌΠ°Π½Π°. ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ ΡΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² - Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π΄Π²ΡΠΊΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ Π²Ρ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π΅ΡΠ΅Π²Π°, ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΠΎ ΡΠΆΠ°ΡΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠ»ΠΈΡΡ Ρ Π°Π΄Π°ΠΏΡΠΈΠ²Π½ΡΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ - ΡΠΆΠ°ΡΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΊΠΎΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²Π° - ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΌ ΡΡΡΡΠ°Π½ΠΈΡΡ ΠΎΠ±Π΅ ΡΠΏΠΎΠΌΡΠ½ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. Π Π² Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΡΠΆΠ°ΡΠΈΠ΅ Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° \JL11, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ»ΠΎΠ²Π°ΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΡΠΆΠΈΠΌΠ°ΡΡ ΡΡΡΠΎΠΊΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², Π° Π½Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ. Π₯ΠΎΡΡ Π²ΡΠ΅ ΡΠ΅ΡΡΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ ΠΈ ΡΠ°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅, Π΄Π»Ρ ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΡΡΠ΄ΠΎΠΌ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΠΈ ΡΡΡΡΠΊΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ ΠΎΠΏΠΈΡΠ°Π½Ρ Π² ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ Π³Π»Π°Π²Π°Ρ .
ΠΠ»Π°Π²Π° 12. ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΠΌΡ.
Π ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ ΠΎΡΠΎΠΉΠ΄Π΅ΠΌ ΠΎΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ΄ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ². ΠΠ½ΠΎΠ³Π΄Π° Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , Π½ΠΎ Π²ΠΎ Π²ΡΠ΅Ρ ΡΠ°ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΡΠ»ΡΠΆΠΈΡΡ ΡΡΡΠΏΠ΅Π½ΡΠΌΠΈ ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½Π½ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ². ΠΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ ΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ - Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΡΠΎΠΈΡΠ΅Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΎΠ² Π½ΠΎΠ²ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ², ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² (Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², ΠΏΡΠΎΠ΅ΠΊΡ - ΡΡΠΎ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΡΡΠΊΠΈΠ· ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°).
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ
Π ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ 32-ΡΠ°Π·ΡΡΠ΄Π½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Windows ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅ΡΠ°ΡΡ ΡΠ΅Π»ΡΠΉ ΡΡΠ΄ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ ΠΏΡΠΎΡΡΠΎ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ. ΠΠ΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΠ΅ΡΠ²Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ - ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Π° Π·Π°ΠΏΡΡΠΊΠ° ΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²Π° ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΎ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΎΠ½Π° ΡΠ΅ΡΠ°Π΅ΡΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ: Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΡΠ΅ΡΠΏΠ½ΡΡΡΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ.