Suurin osa peleistä ja ohjelmista näyttää tallentavan tiedon jonkinlaiseen tiedostoon. Nämä tiedostot ovat usein esim. .dat-päätteisiä tai mitä vain. Olen jo pitkään ihmetellyt, että miten näitä tiedostoja se ohjelma sitten osaa lukea/kirjoittaa siihen. Miksei se tiedosto voi olla vaan plain tekstiä, kuten esimerkiksi .ini-tiedostot.
Miksei esimerkiksi bmp-kuvat ole tekstimuodossa, jolloin sitä voisi muokata millä tahansa tekstieditorilla.
punppis kirjoitti:
Suurin osa peleistä ja ohjelmista näyttää tallentavan tiedon jonkinlaiseen tiedostoon.
No tämähän johtuu ihan käytännön pakosta.
Tietoa voi tallentaa:
Paikallisesti:
- Käyttömuistiin (tyhjenee kun kone sammutetaan)
- Levylle tms. massamuistiin
Muualle:
- Esim. Internetiin (voi olla hidasta ja ei onnistu jos ei nettiyhteyttä)
Eli jos peli tai muu ohjelma haluaa pysyvästi säilyttää tietoa, niin se on järkevää tallentaa Levylle tms. massamuistiin.
Levylle taas tiedostot on järkevää tallentaa tiedostoina tiedostojärjestelmään. Näin samaa levyä voi käyttää useammat ohjelmat ilman että ne häiritsevät toisiaan.
punppis kirjoitti:
Olen jo pitkään ihmetellyt, että miten näitä tiedostoja se ohjelma sitten osaa lukea/kirjoittaa siihen.
Tiedoston muoto on yleensä jossain määritelty ja sitten luku- ja kirjoitusrutiinit tehdään tuon määrittelyn pohjalta. Jos tiedostoa käyttää vain se yksi ohjelma, niin silloin tiedoston määrittelyä ei välttämättä edes julkaista, vaan se on vain tekijän käytössä. Sitten on monenlaisia standardeja tiedostomuotoja (esim. .jpg kuvat) joista määrittelyt on kenen vaan saatavissa.
punppis kirjoitti:
Miksei se tiedosto voi olla vaan plain tekstiä, kuten esimerkiksi .ini-tiedostot.
Tiedostosta tulisi isompi, sen lukeminen ja kirjoittaminen ohjelmallisesti olisi työläämpää, eikä siitä esimerkiksi äänen tai videon tapauksessa olisi mitään hyötyä kenellekään.
punppis kirjoitti:
Miksei esimerkiksi bmp-kuvat ole tekstimuodossa, jolloin sitä voisi muokata millä tahansa tekstieditorilla.
Eli jos ajatellaan vaikka 10x10 px kokoista punaista palloa vihreällä taustalla, niin olisiko se sitten vaikka seuraava:
vihreä,vihreä,vihreä,punainen,punainen,punainen,punainen,vihreä,vihreä,vihreä
vihreä,vihreä,punainen,punainen,punainen,punainen,punainen,punainen,vihreä,vihreä
vihreä,punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen,vihreä
punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen
punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen
punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen
punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen
vihreä,punainen,punainen,punainen,punainen,punainen,punainen,punainen,punainen,vihreä
vihreä,vihreä,punainen,punainen,punainen,punainen,punainen,punainen,vihreä,vihreä
vihreä,vihreä,vihreä,punainen,punainen,punainen,punainen,vihreä,vihreä,vihreä
No sitten syitä miksi näin ei tehdä:
- Kukaan ei halua muokata kuvaa tekstieditorilla, kun kuvankäsittelyohjelmiakin on olemassa
- Täytyisi tehdä erilliset kuvat erikielisille käyttäjille
- Kuvat veisivät paljon enemmän tilaa
- Kuvien lukeminen ohjelmaan olisi työläämpää
- Erilaisten välisävyjen kuvaaminen sanallisesti on hankalaa
Mitä bmp-kuvissa sitten on, jos ei tekstiä? Minä kuvittelisin, että pienin mahdollinen 10x10-kuva (em.) olisi allaolevan mukainen, vaikka tiedostossa olisi mystisiä vänkyräkirjaimia suomen kielen sijaan.
3v4p3v 2v6pv v8pv 10p 10p 10p 10p v8pv 2v6p2v 3v4p3v
Tai jotain sinne suuntaan.
muokkaus:
Kuvan koko tekstinä 61 B
Kuvan koko 24-bittisenä BMP-mystiikkana 374 B
Burton kirjoitti:
Mitä bmp-kuvissa sitten on, jos ei tekstiä?
Burton kirjoitti:
Mitä bmp-kuvissa sitten on, jos ei tekstiä?
No, niinkuin nimestä voisi päätellä, kuva bittikarttana.
Lisäksi siellä on otsake, joka sisältää mm tiedot kuvan koosta (leveys, korkeus), värimäärästä, mahdollisen paletin, jos palettia käyttävä kuva, jotain vakiokenttiä, saattoi olla kuvan tarkkuuskin määritelty. Tuolta dokkaristahan ne selviäisi
Burton kirjoitti:
Kuvan koko tekstinä 61 B
Kuvan koko 24-bittisenä BMP-mystiikkana 374 B
Tuo sinun kuvasi on pikemminkin RLE kuin BMP. Tai no, näköjään BMP-tiedossa voi olla RLE-pakattua tai vaikka PGN-pakattua kuvaa. Täytyisi myös määritellä että mitkä nuo värit p ja v käytännössä ovat.
Sinänsähän tuo sinun kuvasi olisi RLE-enkoodattu 2 värinen (1-bittinen) kuva. Ihan bittikarttanakin ilman headeria (raw bittikartta) 10x10x1bit kuva veisi tilaa 20 tavua.
Tuo 24-bittisyys on ihan järkevää, vaikka äkkiseltään ajatellen tulee isoja kuvia. Jos ajatellaan 10x10 pikselin kokoinen pala valokuvasta, niin se veisi raakabitmappina 300 tavua. Jos ajatellaan että siinä olevat pisteet olisi kaikki erivärisiä (100 eri sävyä), niin miten sen sitten tekstinä järkevästi kuvailisi?
Meinasin lähinnä, että miten ihmeessä se ohjelma osaa muka lukea tiedostoa, jossa ei ole minkäänlaista järkevää tekstiä tai lukuja? Mikä estää tallentamasta tietoja ihan pelkkänä tekstinä, onko tästä muka jotain haittaa?
Tekstimuotoisella kuvatiedostolla meinasin lähinnä tälläistä. Esim. 2x2 kokoinen kuva, jossa kaikki pikselit ovat punaisia tehtäisiin näin.
r,g,b
255,0,0,255,0,0 255,0,0,255,0,0
Moisen tiedoston koko tekstinä olisi 39 tavua ja bittikarttana 70 tavua. Ei tarvitse tehdä eri kielille.
Pilkulla erotetaan red, green ja blue arvot. Kolmen arvon jälkeen vaihtuu tietysti pikseli. Uusi rivi on myös uusi pikselirivi.
Itsekin käytän monesti esimerkiksi 100x100 pikselin kokoista kuvaa jossain, jossa tarvii olla vain jonkunkokoinen kuva. Tämä olisi helppo tehdä vaikka suoraan sillä ohjelmointikielellä. Myös jonkun värin vaihtaminen toiseen olisi äärimmäisen helppoa vaikka pelkällä notepadilla.
Pohjimmillaan en siis ymmärtänyt sitä, että miten ihmeessä (vaikka joku pieni koodiesmierkki) tietoa tallennetaan, jos sitä ei kerta pysty millään editorilla lukemaan. Oman logiikkani mukaan ainakin ensimmäisenä tulee mieleen tekstitiedosto.
punppis kirjoitti:
Meinasin lähinnä, että miten ihmeessä se ohjelma osaa muka lukea tiedostoa, jossa ei ole minkäänlaista järkevää tekstiä tai lukuja?
Esimerkiksi C:n fread ja fwrite lukevat ja kirjoittavat binääridataa. Vastaavat funktiot löytyvät kaikista ohjelmointikielistä.
punppis kirjoitti:
Mikä estää tallentamasta tietoja ihan pelkkänä tekstinä, onko tästä muka jotain haittaa?
Mikään ei estä, tekstimuotoinen data vaan vie enemmän tilaa, koska vain osa merkeistä on käytössä ja notaatiossa on yleensä paljon sellaista, mitä binääridatassa ei tarvita, kuten esimerkkidatasi "pilkut" erottamassa merkkipituudeltaan vaihtelevia numeroesityksiä. Tekstimuotoisesta datasta on hyötyä, jos sitä on tarkoitus muokata "käsin" tekstieditorilla. Bittikarttakuvissa on yleensä niin paljon dataa, että niitä pitää joka tapauksessa käsitellä kuvankäsittelyohjelmalla. Useissa kuvaformaateissa (esim JPEG) data on lisäksi monin tavoin pakattua, eikä sitä voi muokata edes heksaeditorilla (kuten esim. BMP:tä periaatteessa voi)
Jokainen merkki, jonka kirjoitat tiedostoon vie vähintään 8 bittiä (eri merkkikoodauksilla mahdollisesti 16). 8 bitillä voidaan esittää luvut 0-255.
Eikö ole järkevämpää, että luku 255 esitetään yhdellä 8-bitin merkillä (merkki numero 255) sen sijaan, että siihen käytetään 3-4 merkkiä ('2', '5', '5' ja ',')?
Binääritiedostoissa, joita useimmat pelit siis kirjoittavat, on siis suoraan koneen helposti ymmärtäviä binäärilukuja eikä ihmisten helposti ymmärtämiä desimaalilukuja. Binääriluvuilla kirjoitetut tiedostot ovat huomattavasti pienempiä ja ne voidaan lukea ja kopioda suoraan pelin muistii haluttuun tietorakenteeseen ilman, että pelin pitää 'lukea' ja 'ymmärrää' teksti, jonka se sitten muuttaa pelin ymmärtämään muotoon. Binääritiedostojen käyttäminen on siis huomattavasti aikaa ja tilaa säästävämpi tapa.
Tuo sinun 2x2 punainen neliö voidaan binäärimuodossa kirjoittaa 12 tavulla, jos kuvan koko tiedetään etukäteen. Riippuen miten kuvan koon merkitsee, siitä tulee 1-8 tavua lisää tilan vientiä. Perus BMP kuvassa on kuvatiedon lisäksi paljon muuta tietoa, joka vaikuttaa kuvan kokoon. Noin pienellä kuvalla sinun yksinkertainen tiedostoformaatti näyttää pienemmältä, mutta kokeilepa samaa 100x100 kuvalla.
FooBat kirjoitti:
Noin pienellä kuvalla sinun yksinkertainen tiedostoformaatti näyttää pienemmältä, mutta kokeilepa samaa 100x100 kuvalla.
Niin ja sekään ei edes näytä pienemmältä, jos laskee oikein eli 39 tavua tekstinä vs. 16 tavua vastaavan informaation sisältävänä binääritiedostona.
hui kamala kirjoissa ei ole oikeita ihmisiä ja autoja vaan jotain 28 eri eri hassua merkkiä lol kuka sitä ymmärtää kun ei niitä juttuja voi edes nähdä ja siis miten voi tietää minkä värinen jokin on kun lukee "punainen" miten sellaista osaa lukea
tajuatko ei tietokone osaa oikeasti lukea tekstiä se vain laskee ykkösillä ja nollilla ja putkinäyttö näyttää millaista sähköä johdosta tulee kun ei sieltä johdosta mitään värejä tule
Jep, vaihtovirtaa ku tulee niin on vihree pikseli. :|
Yksi tavu (eli yksi merkki) voidaan myös ilmoittaa kaksikirjaimisena heksadesimaalilukuna, eli merkeillä 0-9 ja A-F. On melko helppoa tehdä ohjelma, joka muuttaa binääritiedoston tällaiseksi tekstitiedostoksi - jolloin ohjelmia voi muokata vaikkapa Notepadilla - ja takaisin binäärimuotoon.
Tällainen tiedosto vie kuitenkin kaksi kertaa enemmän tilaa kuin binääritiedosto.
edit: Myös heksaeditori käy.
Tottakai sellaisen ohjelman tekeminen on triviaalia. Löytyy myös sellaisia ohjelmia kuin heksaeditorit, joilla voi suoraan käsitellä binääritiedostoa heksamuodossa vähän kuin notepadilla.
Kunnollisessa notepadissa (kuten Notepad++) heksaeditorikin on sisäänrakennettuna. :D
Ok.
Aihe on jo aika vanha, joten et voi enää vastata siihen.