var f_in: file of byte;

var
  f_in: file of byte;
  f_out: file;
  symb, bbyte: byte;
  i: integer;
  addr, a_ch, f_pos: longint;
  buf: array [0..$0F] of byte;

label
  Next, Exit_all;

begin
  assign(f_in,'in.bin');
  assign(f_out,'out.bin');
  reset(f_in);  
  if IOResult<>0
    then goto Exit_all;
  rewrite(f_out,16);
  if IOResult<>0
    then goto Exit_all;
  addr:=0;
Next:
  a_ch:=$FFFFFFFF;
  f_pos:=filepos(f_in);
  for i:=0 to 7 do
    begin
      read(f_in,symb);
      if IOResult<>0
        then goto Exit_all;
      if ((symb>$2F) and (symb<$3A))
        then symb:=symb-$30
        else if ((symb>$40) and (symb<$47))
          then symb:=symb-$37
          else goto Next;
      a_ch:=(a_ch shl 4) or symb;
    end;
  if a_ch<>addr
    then
      begin
        seek(f_in,f_pos+1);
        goto Next;
      end;
  read(f_in,symb);
  read(f_in,symb);
  for i:=0 to $0F do
    begin
      bbyte:=0;
      read(f_in,symb);
      if ((symb>$2F) and (symb<$3A))
        then symb:=symb-$30
        else if ((symb>$40) and (symb<$47))
          then symb:=symb-$37
          else goto Exit_all;
      bbyte:=(bbyte shl 4) or symb;
      read(f_in,symb);
      if ((symb>$2F) and (symb<$3A))
        then symb:=symb-$30
        else if ((symb>$40) and (symb<$47))
          then symb:=symb-$37
          else goto Exit_all;
      bbyte:=(bbyte shl 4) or symb;
      read(f_in,symb);
      buf[i]:=bbyte;
    end;
  blockwrite(f_out,buf,1);
  addr:=addr+$10;
  goto Next;
Exit_all:
  close(f_in);
  close(f_out);
end.

Пасквиль.

Входной файл - in.bin, выходной файл - out.bin.
А программатору, который сливает в файл такой мусор, нужно было еще во младенчестве засунуть паяльник на 100 Вт поглубже и провернуть:D. Задача бы решалась намного проще, если хотя бы чистые бинарные данные (которые там тоже присутствуют) не разбавлялись случайными переводами каретки (т.е. вместо 0A --> 0D 0A).