2010-03-13 70 views
2

如何將AS3 ByteArray轉換爲wchar_t const* filename如何將AS3 ByteArray轉換爲wchar_t const * filename? (Adobe Alchemy)

所以在我的C代碼中,我有一個函數正在等待文件void fun (wchar_t const* filename)如何發送到該函數我的ByteArray? (或者,我應該如何重寫我的功能?)

+0

我沒有真正進入這個主題,但我想這個鏈接可能會爲您提供一些見解:http://stackoverflow.com/questions/360353/any-way-to-convert-a-regular-string- in-actionscript-3-to-a-bytearray-of-latin-1-c – 2010-03-13 13:35:55

回答

3

一個四個月大的問題。遲到總比不到好?

要將ByteArray轉換爲AS3中的字符串,根據字符串的存儲方式有兩種方法。首先,如果使用writeUTF,它將首先寫入表示字符串長度的unsigned short,然後寫出字符串數據。該字符串最容易以這種方式恢復。下面是它是如何在AS3完成:

byteArray.position = 0; 
var str:String = byteArray.readUTF(); 

另外,toString也能在這種情況下。第二種存儲方式是writeUTFBytes。這不會將長度寫入開頭,所以您需要以某種方式獨立地進行跟蹤。聽起來你想讓整個ByteArray成爲一個字符串,所以你可以使用ByteArray的length

byteArray.position = 0; 
var str:String = byteArray.readUTFBytes(byteArray.length); 

既然你想用鍊金術來做到這一點,你只需要轉換上面的代碼。下面是第二個例子中的轉換:

std::string batostr(AS3_Val byteArray) { 
    AS3_SetS(byteArray, "position", AS3_Int(0)); 
    return AS3_StringValue(AS3_CallS("readUTFBytes", byteArray, 
     AS3_Array("AS3ValType", AS3_GetS(byteArray, "length")))); 
} 

這有內存泄漏的荒謬量,當然,因爲我沒有要求任何地方AS3_Release。爲了我的理智,我在自己的代碼中使用了一個用於AS3_Val的RAII包裝。你應該如此。

無論如何,我的函數std::string將是UTF-8多字節。任何用於轉換爲寬字符的標準C++技術應該從這裏開始。 (搜索網站無盡的轉貼)我建議離開它是因爲它,雖然。我想不出在這個平臺上使用寬字符的好處。

+0

RAII包裝...嗯......你能提供任何鏈接嗎? – Rella 2010-07-28 11:55:39

+0

@Jak:創建一個類,其中一個構造函數接受一個AS3_Val並存儲它。它的拷貝構造函數複製另一個對象的AS3_Val並調用'AS3_Acquire'。在析構函數中調用'AS3_Release'。這是基本的功能性。 – Gunslinger47 2010-07-28 17:27:24