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

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

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

Π’ случаС экспСримСнтов с подбрасываниСм ΠΌΠΎΠ½Π΅Ρ‚Ρ‹ Π±Ρ‹Π»ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ способ хранСния Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…. Но для Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… эта Π·Π°Π΄Π°Ρ‡Π° становится Π±ΠΎΠ»Π΅Π΅ слоТной. ΠŸΡ€ΠΈ этом ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ нСсколько алгоритмичСских ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ². Π”Π²Π° класса сТатия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Π² этой Π³Π»Π°Π²Π΅, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ сТатия Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ с минимальной ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ (minimum redundancy coding) ΠΈ сТатиСм с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ словаря (dictionary compression).

ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с минимальной ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ - это ΠΌΠ΅Ρ‚ΠΎΠ΄ кодирования Π±Π°ΠΉΡ‚ΠΎΠ² (ΠΈΠ»ΠΈ, Π±ΠΎΠ»Π΅Π΅ строго, символов), ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ‡Π°Ρ‰Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π±Π°ΠΉΡ‚Ρ‹ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽΡ‚ΡΡ мСньшим количСством Π±ΠΈΡ‚ΠΎΠ², Ρ‡Π΅ΠΌ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ€Π΅ΠΆΠ΅. НапримСр, Π² тСкстС Π½Π° английском языкС Π±ΡƒΠΊΠ²Ρ‹ Π•, m ΠΈ А Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ‡Π°Ρ‰Π΅, Π½Π΅ΠΆΠ΅Π»ΠΈ Π±ΡƒΠΊΠ²Ρ‹ Q, X ΠΈ Z. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π±Ρ‹ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΡƒΠΊΠ²Ρ‹ Π•, m ΠΈ А мСньшим количСством Π±ΠΈΡ‚ΠΎΠ², Ρ‡Π΅ΠΌ 8 (ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π² соотвСтствии со стандартом ASCII), Π° Π±ΡƒΠΊΠ²Ρ‹ Q, X ΠΈ Z - большим, тСкст Π½Π° английском языкС ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ с использованиСм мСньшСго количСства Π±ΠΈΡ‚ΠΎΠ², Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈ соблюдСнии стандарта ASCII.

ΠŸΡ€ΠΈ использовании сТатия с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ словаря Π΄Π°Π½Π½Ρ‹Π΅ Ρ€Π°Π·Π±ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° большиС Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ (Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ лСксСмами), Ρ‡Π΅ΠΌ символы. Π—Π°Ρ‚Π΅ΠΌ примСняСтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ кодирования лСксСм ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ количСством Π±ΠΈΡ‚ΠΎΠ². НапримСр, слова "the", "and" ΠΈ "to" Π±ΡƒΠ΄ΡƒΡ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ Ρ‡Π°Ρ‰Π΅, Ρ‡Π΅ΠΌ Ρ‚Π°ΠΊΠΈΠ΅ слова, ΠΊΠ°ΠΊ "electric", "ambiguous" ΠΈ "irresistible", поэтому ΠΈΡ… Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ мСньшим количСством Π±ΠΈΡ‚ΠΎΠ², Ρ‡Π΅ΠΌ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π±Ρ‹ ΠΏΡ€ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π² соотвСтствии со стандартом ASCII.

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π±ΠΈΡ‚ΠΎΠ²

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ исслСдованию Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сТатия, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΡ€Π°Ρ‚ΠΊΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ манипулирования Π±ΠΈΡ‚Π°ΠΌΠΈ. ΠŸΡ€ΠΈ использовании Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сТатия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны, сТатиС Π΄Π°Π½Π½Ρ‹Ρ… выполняСтся с использованиСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ количСства Π±ΠΈΡ‚ΠΎΠ², нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π»ΠΈ Π΄Π°Π½Π½Ρ‹Π΅ Π² качСствС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов ΠΈΠ»ΠΈ лСксСм. НСльзя ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Π°ΠΉΡ‚Ρ‹ всСгда Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏ ΠΏΠΎ 8 Π±ΠΈΡ‚ΠΎΠ².

Нам потрСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄Π²Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: считываниС ΠΎΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° ΠΈ запись ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°. На основС этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ считываниС ΠΈ запись сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±ΠΈΡ‚ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ ΠΈ создадим ΠΏΠΎΡ‚ΠΎΠΊ Π±ΠΈΡ‚ΠΎΠ² (bit stream) - структуру Π΄Π°Π½Π½Ρ‹Ρ…, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Π² сСбС Π½Π°Π±ΠΎΡ€ Π±ΠΈΡ‚ΠΎΠ². ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΠΈΡ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ структуру Π΄Π°Π½Π½Ρ‹Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Π΅ Π±ΠΈΡ‚ΠΎΠ² хранятся Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ². Π­Ρ‚Π° структура Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Π±ΠΈΡ‚Ρ‹ Π² соотвСтствии с Π±Π°ΠΉΡ‚Π°ΠΌΠΈ Π² Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π° основС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½Π° построСна. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Delphi, Π² качСствС Π±Π°Π·ΠΎΠ²ΠΎΠΉ структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΠΈΡ‚ΠΎΠ² ΠΌΡ‹ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ TStream (ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ Π½Π΅Π³ΠΎ). Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΡ‹ смогли Π±Ρ‹ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ памяти ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ Ρ„Π°ΠΉΠ»Π° ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΠΈΡ‚ΠΎΠ². ЀактичСски, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±ΠΈΡ‚ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² качСствС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π³Ρ€ΡƒΠΏΠΏ Π±ΠΈΡ‚ΠΎΠ², ΠΌΡ‹ создадим Π΄Π²Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ°: Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΠΈΡ‚ΠΎΠ² ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΠΈΡ‚ΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Seek, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ поиск Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π±ΠΈΡ‚ΠΎΠ² ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ.

Код интСрфСйса классов TtdInputBitStream ΠΈ TtdOutputBitStream ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.1.

Листинг 11.1. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ классов ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±ΠΈΡ‚ΠΎΠ²


type

TtdInputBitStream = class private

FAccum : byte;

FBufEnd : integer;

FBuffer : PAnsiChar;

FBufPos : integer;

FMask : byte;

FName : TtdNameString;

FStream : TStream;

protected


procedure ibsError(aErrorCode : integer;

const aMethodName : TtdNameString);

procedure ibsReadBuffer;

public


constructor Create(aStream : TStream);

destructor Destroy; override;

function ReadBit : boolean;

procedure ReadBits(var aBitString : TtdBitString; aBitCount : integer);

function ReadByte : byte;

property Name : TtdNameString read FName write FName;

end;


TtdOutputBitStream = class private

FAccum : byte;

FBuffer : PAnsiChar;

FBufPos : integer;

FMask : byte;

FName : TtdNameString;

FStream : TStream;

FStrmBroken : boolean;

protected


procedure obsError(aErrorCode : integer;

const aMethodName : TtdNameString);

procedure obsWriteBuffer;

public


constructor Create(aStream : TStream);

destructor Destroy; override;

procedure WriteBit(aBit : boolean);

procedure WriteBits(const aBitString : TtdBitString);

procedure WriteByte(aByte : byte);

property Name : TtdNameString read FName write FName;

end;


Оба конструктора Create Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠΌ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΡƒΠΆΠ΅ созданного ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° TStream. Из этого ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ² класс ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΠΈΡ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π°ΠΉΡ‚Ρ‹. Код конструкторов Create ΠΈ дСструкторов Destroy этих классов ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.2.

Листинг 11.2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΠΈΡ‚ΠΎΠ²


constructor TtdInputBitStream.Create(aStream : TStream);

begin

inherited Create;

FStream := aStream;

GetMem(FBuffer, StreamBufferSize);

end;

destructor TtdInputBitStream.Destroy;

begin

if (FBuffer <> nil) then

FreeMem(FBuffer, StreamBufferSize);

inherited Destroy;

end;

constructor TtdOutputBitStream.Create(aStream : TStream);

begin

inherited Create;

FStream := aStream;

GetMem(FBuffer, StreamBufferSize);

FMask := 1;

{ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒΡΡ ΠΊ записи ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°}

end;

destructor TtdOutputBitStream.Destroy;

begin

if (FBuffer <> nil) then begin

{Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Mask Π½Π΅ Ρ€Π°Π²Π½ΠΎ 1, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ присутствиС Π² аккумуляторной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ Π±ΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ трСбуСтся Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π±ΡƒΡ„Π΅Ρ€. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π±ΡƒΡ„Π΅Ρ€ записываСтся Π² Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ}

if not FStrmBroken then begin

if (FMasko 1) then begin

byte(FBuffer[FBufPos]) := FAccum;

inc(FBufPos);

end;

if ( FBuf Pos > 0 ) then

obsWriteBuffer;

end;

FreeMem(FBuffer, StreamBufferSize);

end;

inherited Destroy;

end;


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° конструктора Create Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ большой Π±ΡƒΡ„Π΅Ρ€ Π±Π°ΠΉΡ‚ΠΎΠ² (Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ мСньшС 4 Кб), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±Ρ‹Π» доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π±Π»ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. Π˜Π½Π°Ρ‡Π΅ говоря, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠ΅Ρ‚ΠΎΠ΄ Destroy Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ этот Π±ΡƒΡ„Π΅Ρ€, ΡƒΠ±Π΅Π΄ΠΈΠ²ΡˆΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΠΈΡ‚ΠΎΠ² Π»ΡŽΠ±Ρ‹Π΅ всС Π΅Ρ‰Π΅ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ записаны Π² Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ссылку Π½Π° своСобразноС ΠΏΠΎΠ»Π΅ класса FStrmBroken. Оно слуТит срСдством ΠΎΠ±Ρ…ΠΎΠ΄Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ условия ошибки. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π±Ρ‹Π» экзСмпляр TFileStream, ΠΈ Ρ‡Ρ‚ΠΎ Π²ΠΎ врСмя использования Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΠΈΡ‚ΠΎΠ² ΠΈΠΌΠ΅Π»ΠΎ мСсто ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ диска. Π’ этом случаС трСбуСтся запись Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΠΈΡ‚ΠΎΠ², ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΊΠ°ΠΊ ΠΎΠ± ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ сгСнСрировано, дальнСйшиС ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ записи Π² Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π»ΠΈΡˆΠ΅Π½Ρ‹ всякого смысла, поэтому ΠΊΠΎΠ΄ устанавливаСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля FStrmBroken Ρ€Π°Π²Π½Ρ‹ΠΌ true, сигнализируя ΠΎ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±ΠΈΡ‚ΠΎΠ², слСдуСт Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ считывания ΠΈ записи ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°. Код выполнСния считывания ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² листингС 11.3. ΠœΠ΅Ρ‚ΠΎΠ΄ ReadBit Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΡƒΠ»Π΅Π²ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - true, Ссли ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ считанный ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΠΈΡ‚ Π±Ρ‹Π» установлСн, ΠΈ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС.

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π±Π°ΠΉΡ‚ маски (FMask), содСрТащий СдинствСнный Π±ΠΈΡ‚ установки ΠΈ выполняСм ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ AND (n) для этой маски ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π±Π°ΠΉΡ‚Π° (FAccum) ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π΅Π½ ΠΎΡ‚ нуля, Π±ΠΈΡ‚ Π² Π±Π°ΠΉΡ‚Π΅ Π±Ρ‹Π» установлСн, ΠΈ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true. Если ΠΎΠ½ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, Π±ΠΈΡ‚ Π² Π±Π°ΠΉΡ‚Π΅ Π±Ρ‹Π» ΠΎΡ‡ΠΈΡ‰Π΅Π½, ΠΈ ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ выполняСм сдвиг маски Π²Π»Π΅Π²ΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ СдинствСнный Π±ΠΈΡ‚ маски Π½Π° ΠΎΠ΄Π½Ρƒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. Если Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π°Ρ‡Π°Π»Π° процСсса маска Π±Ρ‹Π»Π° Π½ΡƒΠ»Π΅Π²ΠΎΠΉ, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ считываниС Π½ΠΎΠ²ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ маску. Если Π±ΡƒΡ„Π΅Ρ€ Π±Ρ‹Π» пуст ΠΈΠ»ΠΈ Π±Ρ‹Π» ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ считан, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ считываниС ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° с Ρ†Π΅Π»ΡŒΡŽ заполнСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°.

Листинг 11.3. Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° TtdInputBitStream


function TtdInputBitStream.ReadBit : boolean;

begin

{Ссли Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ аккумуляторной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π±ΠΈΡ‚ΠΎΠ² Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ считываниС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π±Π°ΠΉΡ‚Π° аккумуляторной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ маски}

if (FMask = 0) then begin

if (FBufPos >= FBufEnd) then

ibsReadBuffer;

FAccum := byte(FBuffer [FBufPos] );

inc(FBufPos);

FMask := 1;

end;

{ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π±ΠΈΡ‚}

Result := (FAccum and FMask) <> 0;

FMask := FMask shl 1;

end;


ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ выяснили, ΠΊΠ°ΠΊ выполняСтся считываниС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°, ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ запись ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° - Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый процСсс, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ выполняСмый Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС. Код ΠΌΠ΅Ρ‚ΠΎΠ΄Π° WriteBit, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ СдинствСнный Π±ΠΈΡ‚ пСрСдаСтся ΠΊΠ°ΠΊ Π±ΡƒΠ»Π΅Π²ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - true, Ссли Π±ΠΈΡ‚ установлСн, ΠΈ false, Ссли ΠΎΠ½ ΠΎΡ‡ΠΈΡ‰Π΅Π½ - ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.4.

Листинг 11.4. Π—Π°ΠΏΠΈΡΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ TtdOutputBitStream


procedure TtdOutputBitStream.WriteBit(aBit : boolean);

begin

{ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ свободный Π±ΠΈΡ‚}

if aBit then

FAccum := (FAccum or FMask);

FMask := FMask shl 1;

{/ΠΏΡ€ΠΈ отсутствии свободных Π±ΠΈΡ‚ΠΎΠ² Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ аккумуляторной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π±ΡƒΡ„Π΅Ρ€ ΠΈ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ аккумуляторной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ маски}

if (FMask = 0) then begin

byte(FBuffer[FBufPos]) := FAccum;

inc(FBufPos);

if (FBufPos >= StreamBufferSize) then

obsWriteBuffer;

FAccum := 0;

FMask := 1;

end;

end;


ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° всСгда начинаСтся ΠΏΡ€ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ аккумуляторного Π±Π°ΠΉΡ‚Π° (FAccum) Ρ€Π°Π²Π½ΠΎΠΌ Π½ΡƒΠ»ΡŽ, Π½ΡƒΠΆΠ½ΠΎ всСго лишь Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ эти Π±ΠΈΡ‚Ρ‹ установки, Π° Π½Π΅ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ…. ΠœΡ‹ снова ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ маску (EMask), ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ СдинствСнный Π±ΠΈΡ‚ установки, Π½ΠΎ Π½Π° этот Ρ€Π°Π· Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π±ΠΈΡ‚, послС Ρ‡Π΅Π³ΠΎ выполняСм ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ OR (Π˜Π›Π˜) ΠΌΠ΅ΠΆΠ΄Ρƒ маской ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ аккумуляторной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ сдвигаСм маску Π²Π»Π΅Π²ΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ‚, подготавливая ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π±ΠΈΡ‚. Однако Ссли Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ маски Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ, потрСбуСтся ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ аккумуляторный Π±Π°ΠΉΡ‚ Π² Π±ΡƒΡ„Π΅Ρ€Π΅ (записывая Π±ΡƒΡ„Π΅Ρ€ Π² Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Ссли Π±ΡƒΡ„Π΅Ρ€ ΠΏΠΎΠ»ΠΎΠ½), Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ аккумуляторного Π±Π°ΠΉΡ‚Π° ΠΈ маски.