2010-08-13 31 views
1
var bytes:ByteArray = new ByteArray; 
bytes.writeInt(0); 

trace(bytes.length); // prints 4 
trace(bytes.toString().length); // prints 4 

當我運行上面的代碼時,輸​​出表明由toString返回的字符串中的每個字符都包含來自ByteArray的一個字節。如果要顯示ByteArray的內容,這當然很棒,但如果要發送以字符串編碼的內容並且字符串的大小很重要,則這並不是那麼好。AS3:ByteArray是否可以將每個unicode字符的內容作爲一個字符串返回兩個字節?

是否有可能從ByteArray中獲得一個字符串,其中字符串中的每個字符都包含來自ByteArray的兩個字節?

回答

5

您可以重新解釋您的ByteArray僅包含短褲。這可以讓您一次讀取兩個字節,並獲取代表它們的單個數字值。接下來,您可以將這些數字重新解釋爲字符代碼。最後,從這些字符代碼創建一個String,就完成了。

public static function encode(ba:ByteArray):String { 
    var origPos:uint = ba.position; 
    var result:Array = new Array(); 

    for (ba.position = 0; ba.position < ba.length - 1;) 
     result.push(ba.readShort()); 

    if (ba.position != ba.length) 
     result.push(ba.readByte() << 8); 

    ba.position = origPos; 
    return String.fromCharCode.apply(null, result); 
} 

有一個需要注意的特殊情況。如果您在嘗試從ByteArray中讀取短的內容時只剩下一個字節,則會拋出異常。在這種情況下,您應該調用readByte,並將值改爲8位。這與原來的ByteArray最後有一個額外的0字節相同。 (使其長度)

現在,解碼這個字符串...獲取每個字符的字符代碼,並將它們放入一個新的ByteArray作爲短褲。它與原始文件相同,除非原始文件有奇數個字節,在這種情況下,解碼後的ByteArray最後會有一個額外的0字節。

public static function decode(str:String):ByteArray { 
    var result:ByteArray = new ByteArray(); 
    for (var i:int = 0; i < str.length; ++i) { 
     result.writeShort(str.charCodeAt(i)); 
    } 
    result.position = 0; 
    return result; 
} 

在行動:

var ba:ByteArray = new ByteArray(); 

ba.writeInt(47); 
ba.writeUTF("Goodbye, cruel world!"); 

var str:String = encode(ba); 
ba = decode(str); 

trace(ba.readInt()); 
trace(ba.readUTF()); 
0

你的問題有點混亂。你已經寫了一個4字節的int給你的ByteArray。你沒有寫任何字符(unicode或其他)。如果您想傳遞文本,請編寫文本並將其作爲UTF8傳遞。至少對於大多數西方語言來說,它將佔用比每個字符有兩個字節更少的空間。

但說實話,我不知道我明白你想要完成什麼。你想發送數字或文字?你在跟什麼後端?你需要一個ByteArray嗎?

相關問題