[php] otwieranie pliku NIE txt

0

witam

chciałem się dowiedzieć czy można (i jak) otworzyć i odczytać dane w PHP z pliku, który został zapisany w PASCALU poprzez rekordy, czyli:

type
 TRekord = packed record
   czas: integer;
   id: shortint;
   x,y: shortint;
 end;
 TRekordFile = file of TRekord;

var 
  Rekord = TRekord;
begin

  assign(outfile, 'date/1.dat');
  rewrite(outfile);

          Rekord.czas:=czas;
          Rekord.id:=klub[k].pilkarze[i].id;
          Rekord.x:=klub[k].pilkarze[i].x;
          Rekord.y:=klub[k].pilkarze[i].y;

          Write(outfile, Rekord);

  close(outfile);
end.

oczywiście plik nie jest czytelny poprzez normalne otwarcie:(

0

Zamiana znaków na liczby i tyle.
Czytasz 4 znaki, zamieniasz na liczbę - masz czas. (nie konwersja. 2563ciag[0]+2562ciag[1]+256*ciag[2]+ciag[3])
Potem kolejne znaki aż odczytasz cały rekord.
Potem kojeny rekord, i kolejny itd.

0

a mnie zaciekawilo, jak najprosciej z bajtow zrobic liczbe i napisalem taki przyklad (tylko z tym najprosciej to chyba mi sie nie udalo), zakladam ze shortint jest jednobajtowym oznaczonym integerem:

<?php

  function bytes2int($str, $signed = false) {
    for ($i = 0; $i < strlen($str); $i++) 
      $ret[] = str_pad(dechex(ord($str[$i])), 2, '0', 0);
    $ret = hexdec(join('', array_reverse($ret)));
    if ($signed && (ord($str[strlen($str) - 1]) & 128))
      $ret -= pow(256, strlen($str)); 
    return $ret;
  }

  function read_TRekord($fp) {
    $ret = array();
    $ret['czas'] = bytes2int(fread($fp, 4), true);
    $ret['id'] = bytes2int(fread($fp, 1), true);
    $ret['x'] = bytes2int(fread($fp, 1), true);
    $ret['y'] = bytes2int(fread($fp, 1), true);
    return $ret;
  }

  $rec = array();
  if ($fp = fopen('date/1.dat', 'rb')) {
    $rec = read_TRekord($fp);
    fclose($fp);
  }
  print_r($rec);

?>
0

jest taka funkcja jak unpack

// dzizas, wiedzialem ze tak bedzie, wszystko juz napisali :( - m.piechnat

dla przypadku powyżej to by było:

<?php

$plik = fopen('date/1.dat', 'rb');

$dlugoscRekordu = 5; // 2B (integer (w turbo pascalu) = 16bit) + 3x 1B (shortint (w tp) = 8bit)

while(strlen($rekord = fread($plik, $dlugoscRekordu)) == $dlugoscRekordu)
  print_r(unpack('sczas/cid/cx/cy', $rekord));

fclose($plik);
?>

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.