Binääritiedoston lukeminen on jonkin verran vaikeampaa, kuin normaalin ascii muotoisen tiedoston lukeminen, joita ovat mm. tekstitiedostot ja xml-tiedostot. Tekstitiedostoissa ei sinänsä ole mitään vikaa, mutta ne alkavat viedä melkoisesti tilaa, jos niihin tallennetaan paljon dataa. Binääritiedostot on taas mahdollista saada paljon pienempään tilaan ja sitä pidän erityisen tärkeänä varsinkin internetissä.
Binääritiedostoa ei kuitenkaan voi lukea, jos et tiedä tiedostoformaattia. Tässä tapauksessa teemme formaatin itse joten tietysti myös tiedämme millainen se on. En käy tässä varsinaisesti läpi miten hoidamme homman UV rendaajassa vaan käydään läpi ihan perustasolla miten nämä binääritiedostot toimivat Flashissa. Palaamme UV rendaajaan vielä myöhemmin tässä blogissa.
Tein scriptin 3dsmaxissa, joka kirjoittaa yksinkertaisen binääritiedoston.
00h 4 byte integer
04h 4 byte integer
08h 4 byte float
0Ch 4 byte float
Tällaisen binääritiedoston lukeminen Flashilla ei ole erityisen vaikeaa.
// ActionScript 3.0
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.utils.ByteArray;
var cURLLoader:URLLoader = new URLLoader(null);
var cURLRequest:URLRequest = new URLRequest(null);
cURLLoader.addEventListener(Event.COMPLETE, cURLLoader_onComplete);
cURLLoader.dataFormat = URLLoaderDataFormat.BINARY;
cURLRequest.url = "test.bin";
cURLLoader.load(cURLRequest);
function cURLLoader_onComplete(event:Event):void
{
var byteArray:ByteArray = cURLLoader.data;
byteArray.endian = Endian.LITTLE_ENDIAN;
byteArray.position = 0;
trace (byteArray.readInt());
trace (byteArray.readInt());
trace (byteArray.readFloat());
trace (byteArray.readFloat());
}
Ellet kuitenkaan ole tutustunut juurikaan binääritiedostojen lukemiseen flashilla niin tuo voi näyttää vähän mystiseltä. Eli käydään koodi läpi.
Importoidaan tarvittavat kirjastot.
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.utils.ByteArray;
Luodaan URLLoader -ja URLRequest oliot, jota käytämme tiedostomme lataamiseen. URLLoader osaa ladata tiedostot binäärimuotoisena. URLRequest on URLLoaderin vaatima luokka, jolla määritellään URL osoite. Alustamme kummankin luokan muodostimen parameterin arvolla null.
var cURLLoader:URLLoader = new URLLoader(null);
var cURLRequest:URLRequest = new URLRequest(null);
Lisätään cURLLoader oliolle tapahtumakuuntelija tapahtumaan COMPLETE, joka lähetetään kun tiedosto on ladattu.
cURLLoader.addEventListener(Event.COMPLETE, cURLLoader_onComplete);
Asetetaan cURLLoader olion data tyypiksi tai formaatiksi binääri ja cURLRequest oliolle kerrotaan URL, josta ladattava tiedosto löytyy.
cURLLoader.dataFormat = URLLoaderDataFormat.BINARY;
cURLRequest.url = "test.bin";
Ladataan tiedosto cURLLoader oliolla.
cURLLoader.load(cURLRequest);
Function cURLLoader_onCompelete määrittely. Tätä funktiota kutsutaan kun tiedosto on ladattu muistiin.
function cURLLoader_onComplete(event:Event):void
Pyydetään cURLLoader luokalta sen ByteArray olio, joka sisältää tiedoston datan binäärimuodossa. Asetetaan endian vastaamaan tiedoston endiania, joka tässä tapauksessa on little endian. Lopuksi varmistetaan, että ollaan datan alussa.
var byteArray:ByteArray = cURLLoader.data;
byteArray.endian = Endian.LITTLE_ENDIAN;
byteArray.position = 0;
Sitten luetaan tiedostoformaatin mukaisesti ensin kaksi 4 tavuista inttiä ja sitten kaksi 4 tavuista floattia.
trace (byteArray.readInt());
trace (byteArray.readInt());
trace (byteArray.readFloat());
trace (byteArray.readFloat());
Siinäpä se olikin.
Ei kommentteja:
Lähetä kommentti