ByteArray sınıfı, flash.utils paketinin bir parçasıdır. ActionScript 3.0'da ByteArray nesnesi oluşturmak için, aşağıdaki örnekte gösterildiği gibi ByteArray sınıfını içe aktarın ve yapıcıyı çağırın:
import flash.utils.ByteArray;
var stream:ByteArray = new ByteArray();
ByteArray yöntemleri
Anlamlı bir veri akışı, istediğiniz bilgiyi bulmak için analiz edebileceğiniz bir biçim olarak organize edilir. Örneğin basit bir çalışan dizisindeki kayıt büyük olasılıkla kimlik numarası, ad, adres, telefon numarası vb. içerir. MP3 ses dosyası, indirilmekte olan dosyanın başlığını, yazarını, albümü, yayınlanma tarihini ve türünü belirten bir Kimlik3 etiketi içerir. Biçim sayesinde, veri akışındaki verileri hangi sırada bekleyeceğinizi bilirsiniz. Bayt akışını mantıklı bir şekilde okuyabilirsiniz.
ByteArray sınıfı bir veri akışından okumayı ve veri akışına yazmayı kolaylaştıran birçok yöntem içerir. Bunlardan bazıları
readBytes()
ve
writeBytes()
,
readInt()
ve
writeInt()
,
readFloat()
ve
writeFloat()
,
readObject()
ve
writeObject()
ve
readUTFBytes()
ve
writeUTFBytes()
yöntemleridir. Bu yöntemler sayesinde veri akışından verileri belirli veri türleri değişkenlerinde okuyabilir ve belirli veri türlerini doğrudan ikili veri akışına yazabilirsiniz.
Örneğin aşağıdaki kod basit bir dize dizisini ve kayar nokta sayısını okur ve her öğeyi ByteArray öğesine yazar. Dizinin organizasyonu sayesinde kod, verileri yazmak için uygun ByteArray yöntemlerini (
writeUTFBytes()
ve
writeFloat()
) çağırabilir. Yinelenen veri modeli sayesinde diziyi bir döngüyle okuyabilirsiniz.
// The following example reads a simple Array (groceries), made up of strings
// and floating-point numbers, and writes it to a ByteArray.
import flash.utils.ByteArray;
// define the grocery list Array
var groceries:Array = ["milk", 4.50, "soup", 1.79, "eggs", 3.19, "bread" , 2.35]
// define the ByteArray
var bytes:ByteArray = new ByteArray();
// for each item in the array
for (var i:int = 0; i < groceries.length; i++) {
bytes.writeUTFBytes(groceries[i++]); //write the string and position to the next item
bytes.writeFloat(groceries[i]); // write the float
trace("bytes.position is: " + bytes.position); //display the position in ByteArray
}
trace("bytes length is: " + bytes.length); // display the length
position özelliği
position özelliği, okuma veya yazma sırasında ByteArray öğesini dizine alan işaretçinin geçerli konumunu saklar. position özelliğinin başlangıç değeri, aşağıdaki kodda da gösterildiği gibi 0'dır (sıfır):
var bytes:ByteArray = new ByteArray();
trace("bytes.position is initially: " + bytes.position); // 0
Bir ByteArray öğesinden okuma veya ByteArray öğesine yazma işlemi gerçekleştirdiğinizde, kullandığınız yöntem, position özelliğini okunan veya yazılan son baytın hemen ardından konuma işaret edecek şekilde güncelleştirir. Örneğin aşağıdaki kod ByteArray öğesine bir dize yazar ve sonrasında position özelliği, ByteArray öğesindeki dizenin hemen ardından bayta işaret eder.
var bytes:ByteArray = new ByteArray();
trace("bytes.position is initially: " + bytes.position); // 0
bytes.writeUTFBytes("Hello World!");
trace("bytes.position is now: " + bytes.position); // 12
Benzer şekilde, bir okuma işlemi de okunan bayt sayısını position özelliğine göre artırır.
var bytes:ByteArray = new ByteArray();
trace("bytes.position is initially: " + bytes.position); // 0
bytes.writeUTFBytes("Hello World!");
trace("bytes.position is now: " + bytes.position); // 12
bytes.position = 0;
trace("The first 6 bytes are: " + (bytes.readUTFBytes(6))); //Hello
trace("And the next 6 bytes are: " + (bytes.readUTFBytes(6))); // World!
Söz konusu uzaklıkta okumak veya yazmak için position özelliğini ByteArray öğesinde belirli bir konuma ayarlayabilirsiniz.
bytesAvailable ve length özellikleri
length
ve
bytesAvailable
özellikleri, ByteArray öğesinin ne kadar süreceğini ve geçerli konumdan sonuna kadar kaç baytı kaldığını gösterir. Aşağıdaki örnek bu özellikleri nasıl kullanabileceğinizi gösterir. Örnek, metnin bir Dizesini ByteArray öğesine yazar ve ardından, “a” ile veya son ile karşılaşana kadar (
bytesAvailable <= 0
) bir kerede bir bayt olacak şekilde ByteArray öğesini okur.
var bytes:ByteArray = new ByteArray();
var text:String = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus etc.";
bytes.writeUTFBytes(text); // write the text to the ByteArray
trace("The length of the ByteArray is: " + bytes.length); // 70
bytes.position = 0; // reset position
while (bytes.bytesAvailable > 0 && (bytes.readUTFBytes(1) != 'a')) {
//read to letter a or end of bytes
}
if (bytes.position < bytes.bytesAvailable) {
trace("Found the letter a; position is: " + bytes.position); // 23
trace("and the number of bytes available is: " + bytes.bytesAvailable); // 47
}
endian özelliği
Bilgisayarlar çok baytlı, yani saklanması için 1 bayttan fazla bellek gereken sayıları saklama yöntemlerine göre farklılık gösterebilir. Örneğin bir tam sayı belleğin 4 baytını veya 32 bitini kaplayabilir. Bazı bilgisayarlar öncelikle sayının en yüksek değerli baytını en düşük bellek adresinde saklar, diğer bilgisayarlar ise öncelikle en düşük değerli baytı saklar. Bilgisayarın veya bayt sıralamasının bu niteliği,
big endian
(önce en yüksek değerli bayt) veya
little endian
(önce en düşük değerli bayt) olarak adlandırılır. Örneğin 0x31323334 sayısı big endian ve little endian bayt sıralaması için aşağıdaki gibi saklanır, a0, 4 bayt arasında en düşük bellek adresini ve a3 en yüksek olanı temsil eder:
Big Endian
|
Big Endian
|
Big Endian
|
Big Endian
|
a0
|
a1
|
a2
|
a3
|
31
|
32
|
33
|
34
|
Little Endian
|
Little Endian
|
Little Endian
|
Little Endian
|
a0
|
a1
|
a2
|
a3
|
34
|
33
|
32
|
31
|
ByteArray sınıfının
endian
özelliği, işlediğiniz çok baytı sayılar için bu bayt sırasını belirtmenizi sağlar. Bu özellik için kabul edilebilir değerler
"bigEndian"
veya
"littleEndian"
değerleridir ve Endian sınıfı,
endian
özelliğini bu dizelerle ayarlamak için
BIG_ENDIAN
ve
LITTLE_ENDIAN
sabitlerini tanımlar.
compress() ve uncompress() yöntemleri
compress()
yöntemi sayesinde bir ByteArray öğesini, parametre olarak belirttiğiniz bir sıkıştırma algoritmasına göre sıkıştırabilirsiniz.
uncompress()
yöntemi sayesinde, sıkıştırılmış bir ByteArray öğesini sıkıştırma algoritmasına göre genişletebilirsiniz.
compress()
ve
uncompress()
yöntemlerini çağırdıktan sonra, bayt dizisinin uzunluğu yeni uzunluğa ve position özelliği sona ayarlanır.
CompressionAlgorithm sınıfı, sıkıştırma algoritmasını belirtmek için kullanabileceğiniz sabitleri tanımlar. ByteArray sınıfı deflate (yalnızca AIR), zlib ve lzma algoritmalarını destekler. Zlib sıkıştırılmış veri biçimi açıklaması için bkz.
http://www.ietf.org/rfc/rfc1950.txt
lzma algoritması Flash Player 11.4 ve AIR 3.4 için eklendi. Açıklaması için bkz.
http://www.7-zip.org/7z.html
.
Deflate sıkıştırma algoritması zlib, gzip ve bazı zip uygulamaları gibi çeşitli sıkıştırma biçimlerinde kullanılır. Deflate sıkıştırma algoritması açıklaması için bkz.
http://www.ietf.org/rfc/rfc1951.txt
.
Aşağıdaki örnek,
bytes
adındaki ByteArray öğesini lzma algoritması kullanarak sıkıştırır:
bytes.compress(CompressionAlgorithm.LZMA);
Aşağıdaki örnek sıkıştırılmış bir ByteArray öğesini deflate algoritması kullanarak genişletir:
bytes.uncompress(CompressionAlgorithm.LZMA);
Nesneleri okuma ve nesnelere yazma
readObject()
ve
writeObject()
yöntemleri, serileştirilmiş Action Message Format (AMF) olarak kodlanmış şekilde ByteArray öğesinden bir nesne okur ve ByteArray öğesine bir nesne yazar. AMF, Adobe tarafından oluşturulan ve Netstream, NetConnection, NetStream, LocalConnection ve Paylaşılan Nesneleri de içeren çeşitli ActionScript 3.0 sınıfları tarafından kullanılan özel bir mesaj protokolüdür.
Tek baytlı tür işaretleyicisi, ardından gelen kodlanmış verilerin türünü açıklar. AMF aşağıdaki 13 veri türünü kullanır:
value-type = undefined-marker | null-marker | false-marker | true-marker | integer-type |
double-type | string-type | xml-doc-type | date-type | array-type | object-type |
xml-type | byte-array-type
Kodlanmış veriler, işaretleyici null veya true ya da false gibi, hiçbir verinin kodlanmadığı tek bir olası değer temsil edene kadar tür işaretleyicisini izler.
AMF'nin iki sürümü vardır: AMF0 ve AMF3. AMF 0, karmaşık nesneleri başvuruya göre göndermeyi destekler ve uç noktaların nesne ilişkilerini geri yüklemesini sağlar. AMF 3, nesne özelliklerini ve dizeleri nesne başvurularına ek olarak başvuruya göre göndererek ve ActionScript 3.0 uygulamasında tanıtılan yeni veri türlerini destekleyerek AMF 0'ı iyileştirir.
ByteArray.objectEcoding
özelliği, nesne verilerinin kodlanmasında kullanılan AMF sürümünü belirtir. flash.net.ObjectEncoding sınıfı, AMF sürümünü belirtmeye yönelik sabitleri tanımlar:
ObjectEncoding.AMF0
ve
ObjectEncoding.AMF3
.
Aşağıdaki örnek, bir XML nesnesini ByteArray öğesine yazmak için
writeObject()
öğesini çağırır, ardından Deflate algoritmasını kullanarak öğeyi genişletir ve masaüstündeki
order
dosyasına yazar. Örnek, işlem bittiğinde AIR penceresinde “Sıra dosyası masaüstüne yazıldı!” mesajını görüntülemek için mesajını görüntüler.
import flash.filesystem.*;
import flash.display.Sprite;
import flash.display.TextField;
import flash.utils.ByteArray;
public class WriteObjectExample extends Sprite
{
public function WriteObjectExample()
{
var bytes:ByteArray = new ByteArray();
var myLabel:TextField = new TextField();
myLabel.x = 150;
myLabel.y = 150;
myLabel.width = 200;
addChild(myLabel);
var myXML:XML =
<order>
<item id='1'>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>;
// Write XML object to ByteArray
bytes.writeObject(myXML);
bytes.position = 0; //reset position to beginning
bytes.compress(CompressionAlgorithm.DEFLATE); // compress ByteArray
writeBytesToFile("order.xml", bytes);
myLabel.text = "Wrote order file to desktop!";
}
private function writeBytesToFile(fileName:String, data:ByteArray):void
{
var outFile:File = File.desktopDirectory; // dest folder is desktop
outFile = outFile.resolvePath(fileName); // name of file to write
var outStream:FileStream = new FileStream();
// open output file stream in WRITE mode
outStream.open(outFile, FileMode.WRITE);
// write out the file
outStream.writeBytes(data, 0, data.length);
// close it
outStream.close();
}
}
readObject()
yöntemi, serileştirilmiş AMF'deki bir nesneyi ByteArray öğesinden okur ve belirtilen türde bir nesnede saklar. Aşağıdaki örnek
order
dosyasını masaüstünden ByteArray öğesine (
inBytes
) okur, genişletir ve
orderXML
XML nesnesinde saklamak için
readObject()
öğesini çağırır. Örnek, her düğümü görüntüleme için bir metin alanına eklemek üzere
for each()
döngü yapısı kullanır. Örnek ayrıca
objectEncoding
özelliğinin değerini de,
order
dosyasının içeriğine yönelik bir üstbilgiyle birlikte görüntüler.
import flash.filesystem.*;
import flash.display.Sprite;
import flash.display.TextField;
import flash.utils.ByteArray;
public class ReadObjectExample extends Sprite
{
public function ReadObjectExample()
{
var inBytes:ByteArray = new ByteArray();
// define text area for displaying XML content
var myTxt:TextField = new TextField();
myTxt.width = 550;
myTxt.height = 400;
addChild(myTxt);
//display objectEncoding and file heading
myTxt.text = "Object encoding is: " + inBytes.objectEncoding + "\n\n" + "order file: \n\n";
readFileIntoByteArray("order", inBytes);
inBytes.position = 0; // reset position to beginning
inBytes.uncompress(CompressionAlgorithm.DEFLATE);
inBytes.position = 0; //reset position to beginning
// read XML Object
var orderXML:XML = inBytes.readObject();
// for each node in orderXML
for each (var child:XML in orderXML)
{
// append child node to text area
myTxt.text += child + "\n";
}
}
// read specified file into byte array
private function readFileIntoByteArray(fileName:String, data:ByteArray):void
{
var inFile:File = File.desktopDirectory; // source folder is desktop
inFile = inFile.resolvePath(fileName); // name of file to read
var inStream:FileStream = new FileStream();
inStream.open(inFile, FileMode.READ);
inStream.readBytes(data);
inStream.close();
}
}
|
|
|