AS3: Может ли ByteArray возвращать свое содержимое в виде строки с двумя байтами на символ юникода? - PullRequest
1 голос
/ 13 августа 2010
var bytes:ByteArray = new ByteArray;
bytes.writeInt(0);

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

Когда я запускаю приведенный выше код, вывод предполагает, что каждый символ в строке, возвращаемой toString, содержит один байт из ByteArray.Это, конечно, замечательно, если вы хотите отобразить содержимое ByteArray, но не так здорово, если вы хотите отправить его содержимое, закодированное в строку, и размер строки имеет значение.строка из ByteArray, где каждый символ в строке содержит два байта из ByteArray?

Ответы [ 2 ]

5 голосов
/ 14 августа 2010

Вы можете переосмыслить свой 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 голосов
/ 13 августа 2010

Ваш вопрос немного сбивает с толку. Вы записали 4-байтовое int в свой ByteArray. Вы не написали какие-либо символы (Unicode или другие) к нему. Если вы хотите передать текст, напишите текст и передайте его как UTF8. Это займет меньше места, чем два байта для каждого символа, по крайней мере для большинства западных языков.

Но, честно говоря, я не уверен, что понял, чего вы пытаетесь достичь. Вы хотите отправить цифры или текст? С каким бэкэндом ты разговариваешь? Вам вообще нужен ByteArray?

...