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

时间:2010-08-13 14:47:02

标签: actionscript-3 unicode encoding bytearray tostring

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 个答案:

答案 0 :(得分: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读取短路,则会抛出异常。在这种情况下,您应该使用值为8位的值调用readByte。这与原始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());

答案 1 :(得分:0)

你的问题有点令人困惑。您已经为ByteArray写了一个4字节的int。你没有写任何字符(unicode或其他)。如果要传递文本,请写入文本并将其作为UTF8传递。与每个字符的两个字节相比,它所占用的空间更少,至少对于大多数西方语言而言。

但老实说,我不确定我是否理解你要完成的任务。你想发送数字或文字吗?你在说什么后端?你需要一个ByteArray吗?