AS3:ByteArray可以将其内容作为字符串返回,每个unicode字符有两个字节吗?

And*_*ers 1 unicode encoding bytearray tostring actionscript-3

var bytes:ByteArray = new ByteArray;
bytes.writeInt(0);

trace(bytes.length); // prints 4
trace(bytes.toString().length); // prints 4
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码的输出表明,通过的toString返回的字符串中的每个字符包含从ByteArray的一个字节.如果你想发送的字符串和字符串事项的大小编码的内容当然,这是伟大的,如果你想显示ByteArray的内容,但没有那么大.

是否有可能得到其中字符串中的每个字符包含来自ByteArray的两个字节的ByteArray一个字符串?

Gun*_*r47 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);
}
Run Code Online (Sandbox Code Playgroud)

有一个特殊情况需要注意.如果你尝试从ByteArray只剩下一个字节的时候读取短路,则会抛出异常.在这种情况下,您应该调用readByte8位的值来代替.这与原始文件ByteArray末尾有一个额外的0字节相同.(使其长度均匀)

现在,至于解码这个String ...获取每个角色的角色代码,并将它们放入一个新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;
}
Run Code Online (Sandbox Code Playgroud)

在行动:

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());
Run Code Online (Sandbox Code Playgroud)