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); ?>
kato perkele.. Ihan uusia ideoita eksyy joukkoon valtavaan. ;) Aika hyvä vinkki, vaikkakin hyötyarvo jää olemattomaksi..
Ihme idea, en olisi itse keksinyt tehdä tätä php:llä.
Kyllähän tuostakin jotain oppii, eikä se ole edes kauhean pitkä.
tää alkaa lataa tota tiedostoo... ehkä toi headeri ei oo niin hyödyllinen tässä? :P ei jaksais aina lataa sitä koneelle
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ä...
Vähän aiheeseen liittyen olen tehnyt skriptin, joka kääntää merkkijonon hexaksi...
http://mbnet.fi/heikki_m/hexa.php
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.
Pieni punkki:
32 kuuluu 'tavallisiin merkkeihin' (väli).
Hih.. Kivan näköistä koodia ja mielenkiintoinen idea :)
Hyvin kommentoitu.. hyvä koodivinkki!
demon urli ei pelitä.
Kätsy koodi tulee tarpeeseen :]
Ihan kiva, jos vain tuosta tulosteesta jotain ymmärtäisi :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.