Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Tiedoston tulostus heksamuodossa

Sivun loppuun

Antti Laaksonen [30.05.2003 22:16:40]

#

Heksaeditori on varmaan monelle tuttu työkalu, jolla on mahdollista käsitellä tiedostoa yksittäisen tavun tarkkuudella. Erään oman projektin innoittamana tein PHP:llä skriptin, joka jäljittelee heksaeditorin näkymää. Kuitenkin ainoastaan tiedoston tavujen tutkiminen onnistuu - ei niiden muuttaminen.

Demo: http://koti.mbnet.fi/pllk/muut/heksa.php

<?php
//******************************************************
//* Skripti näyttää tiedoston heksaeditorin tavoin.    *
//* Tekijä: Antti Laaksonen (antti.laaksonen@mbnet.fi) *
//******************************************************

//dokumentin tyyppi on tavallinen teksti
header ("Content-type: text/plain");

//luettava tiedosto
$tiedosto = "ln2.png";
//tavujen (heksat ja merkit) määrä yhdellä rivillä
$tavujarivillä = 16;
//tiedoston kohtaa osoittavan rivin pituus (tarvittaessa etunollia)
$kohdanpituus = 8;

//avataan tiedosto ja haetaan sen koko
$d = fopen($tiedosto, "r");
$koko = filesize($tiedosto);

//näytetään tiedoston nimi ja koko
echo "$tiedosto ($koko tavua)\n\n";

//kohtalaskurin alustus
$kohta = 0;

//luetaan tiedostoa sen loppuun saakka
while (!feof($d)) {
   //luetaan seuraavat tavut muuttujaan
   $tavut = fread($d, $tavujarivillä);

   //tyhjennetään rivi
   $heksat = "";
   $merkit = "";

   //muodostetaan kohtarivi
   $kohtat = substr(str_repeat("0", $kohdanpituus) . strtoupper(dechex($kohta)), -$kohdanpituus);

   //käydään kaikki tavut läpi
   for ($i=0; $i < $tavujarivillä; $i++) {
      //jos ei olla tiedoston lopussa...
      if ($kohta + $i < $koko) {
         //luetaan yksittäinen merkki ja muodostetaan siitä heksadesimaali
         $merkki = substr($tavut, $i, 1);
         $heksa = substr(strtoupper("0".dechex(ord($merkki))), -2);

         //lisätään heksa riville
         $heksat .= $heksa;
         //joka toisen numeron jälkeen tulee välilyönti
         if ($i % 2 == 1) {$heksat .= " ";}

         //jos merkki on tavallisen merkistön ulkopuolella, se näytetään pisteenä
         if (ord($merkki) < 32 || ord($merkki) > 127){$merkki = "."; }
         //lisätään merkki riville
         $merkit = $merkit . $merkki;
      //muussa tapauksessa jatketaan riviä tyhjällä
      } else {
         $heksat .= "  ";
         if ($i % 2 == 1) {$heksat .= " ";}
      }
   }
   echo "$kohtat  $heksat $merkit\n";
   $kohta = $kohta + $tavujarivillä;
}

//suljetaan tiedosto
fclose($d);

?>

progo [31.05.2003 11:10:39]

#

kato perkele.. Ihan uusia ideoita eksyy joukkoon valtavaan. ;) Aika hyvä vinkki, vaikkakin hyötyarvo jää olemattomaksi..

Sami [31.05.2003 11:57:32]

#

Ihme idea, en olisi itse keksinyt tehdä tätä php:llä.
Kyllähän tuostakin jotain oppii, eikä se ole edes kauhean pitkä.

T.M. [31.05.2003 20:41:03]

#

tää alkaa lataa tota tiedostoo... ehkä toi headeri ei oo niin hyödyllinen tässä? :P ei jaksais aina lataa sitä koneelle

mikaelh [01.06.2003 13:27:27]

#

Internet Explorer lataa koneelle suunnilleen kaiken, minkä tyyppi ei ole text/html. ;-)
Se tyyppi on siinä sitä varten, että muut selaimet osaavat näyttää sen fontilla, jossa kaikki kirjaimet ovat yhtä leveitä.

Vähän aiheeseen liittyen itse olen tehnyt funktion, joka näyttää merkkijonon merkit binääreinä...

Heikki [02.06.2003 21:02:53]

#

Vähän aiheeseen liittyen olen tehnyt skriptin, joka kääntää merkkijonon hexaksi...
http://mbnet.fi/heikki_m/hexa.php

weicco [05.06.2003 10:07:26]

#

IE ei välitä headereista tuon taivaallista vaan käyttää omaa maagista kykyään tunnistamaan tiedostotyyppejä. Tästä syystä Windowsille onkin niin mukava kirjoitella viiiiiruksia.

thefox [11.06.2003 17:50:16]

#

Pieni punkki:

if (ord($merkki) < 33 || ord($merkki) > 127){$merkki = "."; }

32 kuuluu 'tavallisiin merkkeihin' (väli).

odys [18.06.2003 04:08:30]

#

Hih.. Kivan näköistä koodia ja mielenkiintoinen idea :)
Hyvin kommentoitu.. hyvä koodivinkki!

Nyntti [18.02.2004 03:30:42]

#

demon urli ei pelitä.

D4_B34M [10.12.2004 11:49:57]

#

Kätsy koodi tulee tarpeeseen :]

ApE!0 [29.09.2007 23:59:37]

#

Ihan kiva, jos vain tuosta tulosteesta jotain ymmärtäisi :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta