Вы можете переосмыслить свой 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());