Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 108

Автор Π”ΠΆΡƒΠ»ΠΈΠ°Π½ Π‘Π°ΠΊΠ½Π΅Π»Π»

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 приходится Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΉ ряд ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… просто Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, пСрвая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ приходится ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ - ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ способа запуска ΠΈ останова ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Но Π² основном ΠΎΠ½Π° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы: достаточно Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΡ‡Π΅Ρ€ΠΏΠ½ΡƒΡ‚Ρ‹Π΅ свСдСния.