Π ΡΠ»ΡΡΠ°Π΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² Ρ ΠΏΠΎΠ΄Π±ΡΠ°ΡΡΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠ½Π΅ΡΡ Π±ΡΠ»ΠΎ ΠΎΡΠ΅Π½Ρ Π»Π΅Π³ΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π½Π°ΠΈΠ»ΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ . ΠΠΎ Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ Π΄Π°Π½Π½ΡΡ ΡΡΠ° Π·Π°Π΄Π°ΡΠ° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ. ΠΡΠΈ ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠ². ΠΠ²Π° ΠΊΠ»Π°ΡΡΠ° ΡΠΆΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΡΠΆΠ°ΡΠΈΡ Π±Π΅Π· ΠΏΠΎΡΠ΅ΡΡ ΠΈ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ·Π±ΡΡΠΎΡΠ½ΠΎΡΡΡΡ (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 (ΠΠΠ) ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΠ°ΡΠΊΠΎΠΉ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΡΠ΄Π²ΠΈΠ³Π°Π΅ΠΌ ΠΌΠ°ΡΠΊΡ Π²Π»Π΅Π²ΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ, ΠΏΠΎΠ΄Π³ΠΎΡΠ°Π²Π»ΠΈΠ²Π°Ρ ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π±ΠΈΡ. ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΠ»ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΡΠΊΠΈ ΡΠ°Π²Π½ΠΎ Π½ΡΠ»Ρ, ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ½ΡΠΉ Π±Π°ΠΉΡ Π² Π±ΡΡΠ΅ΡΠ΅ (Π·Π°ΠΏΠΈΡΡΠ²Π°Ρ Π±ΡΡΠ΅Ρ Π² Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ, Π΅ΡΠ»ΠΈ Π±ΡΡΠ΅Ρ ΠΏΠΎΠ»ΠΎΠ½), Π° Π·Π°ΡΠ΅ΠΌ ΡΠ±ΡΠΎΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ° ΠΈ ΠΌΠ°ΡΠΊΠΈ.