Абе много сложно си го направил...
Аз бих написал нещо такова:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
bytes : Array[0..20] of Byte = ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF,
$FF, $7F, $00, $00, $E0, $FF, $FF, $FF, $FF, $FF, $FF);
bits : Array[0..21 * 8 - 1] of Boolean;
procedure BytesToBits(bias : Integer);
var i, j, k : Integer;
begin
k := -bias;
if k < 0 then k := k + Length(bits);
if k > High(bits) then k := k - Length(bits);
for i := 0 to High(bytes) do
for j := 0 to 7 do begin
bits[k] := bytes[ i ] and (1 shl j) <> 0;
k := (k + 1) mod Length(bits);
end;
end;
procedure BitsToBytes(bias : Integer);
var i, j, k : Integer;
begin
k := -bias;
if k < 0 then k := k + Length(bits);
if k > High(bits) then k := k - Length(bits);
for i := 0 to High(bytes) do begin
bytes[ i ] := 0;
for j := 0 to 7 do begin
bytes[ i ] := bytes[ i ] or (Byte(bits[k]) shl j);
k := (k + 1) mod Length(bits);
end;
end;
end;
// за тест:
var i : Integer;
begin
BytesToBits(25);
for i := 0 to High(bits) do begin
if i mod 21 = 0 then writeln;
write(byte(bits[ i ]));
end;
BitsToBytes(25);
writeln;
for i := 0 to High(bytes) do begin
write(IntToHex(bytes[ i ], 2), ' ');
end;
readln;
end.