Alchemy之讀取AS ByteArray數據類型

2009-05-14
Alchemy的C API裡沒有直接讀取ByteArray數據類型的方法,但在圖像處理等很多情況下我們都需要用到ByteArray,那C該如何處理ByteArray類型的數據呢?看下面的演示函數:
//讀取AS傳入的ByteArray類型數據
static AS3_Val readByteArray(void *self, AS3_Val args)
{
    //提取ByteArray
    AS3_Val data = AS3_Undefined();
    AS3_ArrayValue(args, "AS3ValType", &data);

    //獲取ByteArray長度
    AS3_Val prop = AS3_String("length");
    int length = AS3_IntValue(AS3_Get(data, prop));
    
    int i, tmp;
    char buffer[128];
    for (i = 0; i < length; i ++){
        //讀取ByteArray裡的值並輸出到終端顯示
        tmp = AS3_IntValue(AS3_Get(data, AS3_Int(i)));
        sprintf(buffer, "[%d] : %d", i, tmp);
        sztrace(buffer);
    }
    
    return AS3_Null();
}
注意一下AS3_Get這個函數,它用于獲取一個AS Object obj的指定屬性prop,屬性用一個AS String字符串來表示,其函數定義為:
AS3_Val AS3_Get(AS3_Val obj, AS3_Val prop)
如果obj不存在指定屬性,則函數返回NULL

然後在AS裡寫如下代碼來調用C函數並傳入ByteArray參數:
//初始化Alchemy
var loader:CLibInit = new CLibInit();
var lib:Object = loader.init();

//創建一個ByteArray並寫入點數據
var bytes:ByteArray = new ByteArray();
bytes.writeByte(10);
bytes.writeByte(20);
bytes.writeByte(255);

//調用C函數
lib.readByteArray(bytes);
測試結果如下:
[0] : 10
[1] : 20
[2] : 255

PS : 另外在C代碼裡,除了AS3_Get(data, AS3_Int(i))外,還可以用如下方法讀取ByteArray:
unsigned char rs;
AS3_ByteArray_seek(data, 0, SEEK_SET);
AS3_ByteArray_readBytes(&rs, data, 1);
傳說中這樣比較高效~~
AS3_ByteArray_seek
AS3_ByteArray_readBytes
AS3_ByteArray_writeBytes
這三個函數是C用來操作ByteArray的,詳細用法請自行參閱Alchemy API

M-OSCAR | Powered by Blogger | Entries (RSS) | Comments (RSS) | Designed by MB Web Design | XML Coded By Cahayabiru.com