program kodavimas_4_bitais;
  { 133 u‘davinys }
  { programos kod.exe ižeitinis tekstas }

  const bitai = 4;         { bit— grup‚s ilgis }
        lent: string[16] = '0123456789ABCDEF';
              { kodavimui naudojami simboliai }
        max = 10000; { maksimalus rezultat— bylos dydis baitais }
  procedure klaida;
    { nutraukia programos darb… d‚l vedimo/ižvedimo klaidos }
  begin
    writeln ('­vedimo/ižvedimo klaida!');
    halt;
  end;

  procedure atidar_bylas (var fskait, fras : file);
    { patikrina parametrus ir atidaro bylas }
  begin
    writeln;
    if paramcount <> 2 { jei nenurodyti tinkami parametrai }
       then begin
              writeln ('Naudojimas: ');
              writeln( ' KOD.EXE  duom.dat rez.dat' );
              writeln;
              halt;
            end;
    assign (fskait, paramstr(1));
    {$I-}
    reset (fskait, 1);
    {$I+}
    if ioresult <> 0
       then klaida;
    assign (fras, paramstr(2));
    {$I-}
    rewrite (fras, 1);
    {$i+}
    if ioresult <> 0
       then klaida;
  end;

  procedure uzdar_bylas (var fskait, fras : file);
  begin
    close (fras);
    close (fskait);
  end;

  procedure kodavimas (var fskait, fras : file);
    { u‘koduoja duxomenis }
    var duom, rez : array [1..max] of byte;
        dydis, { pradini— duomen— bylos dydis baitais }
        rsk,   { rezultat— bylos dydis baitais }
        perskait, i, sk, poslinkis, kauke : integer;
        bit4 : byte; { keturi— bit— grup‚ }
  begin
    { inicializuojame pradini— duomen— ir rezultat— masyvus }
    fillchar (duom, sizeof(duom), 0);
    fillchar (rez, sizeof(rez), 0);
    { randame pradini— duomen— kiek baitais }
    dydis := filesize (fskait);
    { perskaitome pradinius duomenis }
    blockread (fskait, duom, dydis, perskait);
    if perskait <> dydis
       then begin
              uzdar_bylas (fskait, fras);
              klaida;
            end;
    i := 1;
    poslinkis := 0;
    rsk := 0;
    kauke := $0F; { 00001111 }
    while i <= dydis do
      begin
        rsk := rsk + 1;
        { paimam eilinius 4 bitus }
        bit4 := (duom[i] shr poslinkis) and kauke;
        { juos u‘koduojame vienu baitu kur ražome  rezultat— masyv… }
        rez[rsk] := ord (lent[bit4 + 1]);
        poslinkis := poslinkis + bitai;
        if poslinkis > 7 { paslenkama arba per 0 arba per 4 bitus }
           then begin
                  poslinkis := poslinkis - 8;
                  i := i + 1
                end;
      end;
    { ražome u‘koduotus duomenis  rezultat— byl… }
    blockwrite (fras, rez, rsk, dydis);
    if rsk <> dydis
       then klaida;
  end;

  var fskait, fras : file;
begin
  atidar_bylas (fskait, fras);
  kodavimas (fskait, fras);
  uzdar_bylas (fskait, fras);
end.











