ActionScript 3.0 - ByteArray中的空字节

时间:2012-05-13 05:18:38

标签: actionscript-3 bytearray

我试图理解ByteArray中空字节的重要性。他们是否像终结者一样?我的意思是,一旦写入空字节,我们不能再写入ByteArray吗?

例如,

import flash.utils.*;

public class print3r{
    public function print3r{
        Util.print(nullout());
    }

    public function nullout:ByteArray (){
        var bytes:ByteArray = new ByteArray();
        bytes.writeInt(((403705888 + 1) - 1)); // Non Printable Characters
        bytes.writeInt(((403705872 - 1) + 1)); // Non Printable Characters
        bytes.writeInt(0x18101000); // Notice the NullByte in this DWORD
        bytes.writeInt(0x41424344); // ASCII Characters ABCD
        return bytes;
    }
}

new print3r;

这会产生空白输出。

现在,如果我用0x18101010替换DWORD,0x18101000,这次我可以在输出中看到ASCII填充,ABCD。

我的问题是,是否可以将空字节写入ByteArray()?

我问的原因是因为我在ActionScript代码中看到,即使在写入空字节之后,也会在ByteArray上执行很多writeInt和writeByte操作。

感谢。

2 个答案:

答案 0 :(得分:5)

  

是否可以将空字节写入ByteArray()?

当然是。 ByteArray - 是一大块原始数据。你可以在那里写任何你喜欢的东西,你可以以任何你喜欢的方式阅读(使用零字节作为分隔符或你可能想做的任何其他事情)。

使用trace()将字节发送到标准输出时所看到的内容,完全取决于您对数据的实际操作,将其转换为字符串。有几种方法可以将字节数组转换为字符串。因此,您的问题缺少Util.print()方法的解释。

以下是将字节转换为字符串的几个选项:

  • 循环遍历字节和输出字符,编码取决于您。
  • 使用ByteArray.readUTFBytes()读取字符串。该方法读取utf编码的符号;当遇到零字符时它会停止。
  • 使用ByteArray.readUTF()读取字符串。此方法希望您的字符串以unsigned short为前缀,表示其长度。换句话说,它与ByteArray.readUTFBytes()相同。
  • 使用ByteArray.toString()。只需执行trace(byteArray);即会发生这种情况。此方法忽略零字节并输出其余字节。此方法使用System.useCodePage设置来决定编码,如果数据以此开头,则可以使用UTF BOM。

以下是一些说明上述内容的测试:

var test:ByteArray = new ByteArray();

// latin (1 byte per character)
test.writeUTFBytes("ABC");

// zero byte
test.writeByte(0);

// cyrillic (2 bytes per character)
test.writeUTFBytes("\u0410\u0411\u0412");

trace(test); // ABCАБВ
trace(test.toString()); // ABCАБВ
test.position = 0;
trace(test.readUTFBytes(test.length)); // ABC

// simple loop
var output:String = "";
var byte:uint;
for (var i:uint = 0; i<test.length; i+=1) {
    byte = uint(test[i]);
    if (output.length && i%4 == 0) {
        output += " ";
    }
    output += (byte > 0xF ? "" : "0") + byte.toString(16);
}
trace(output); // 41424300 d090d091 d092

答案 1 :(得分:1)

就我所知,将null写入字节数组没有任何意义。但是,print函数可以将它用作字符串终止符。