ActionScript 3.0-ByteArray中的空字节

Neo*_*ash 2 bytearray actionscript-3

我试图了解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;
Run Code Online (Sandbox Code Playgroud)

这给出空白输出。

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

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

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

谢谢。

Nox*_*tis 5

是否有可能将空字节后的内容写入ByteArray()?

当然是这样。ByteArray-是大量原始数据。您可以在此处编写任何内容,也可以以您喜欢的任何方式进行读取(使用零字节作为分隔符,也可以执行其他任何操作)。

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

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

  • 遍历字节并输出字符,编码取决于您。
  • 使用ByteArray.readUTFBytes()读取字符串。此方法读取utf编码的符号;遇到零字符时停止。
  • 使用ByteArray.readUTF()读取字符串。此方法期望您的字符串以无符号短前缀表示其长度。换句话说,它与相同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
Run Code Online (Sandbox Code Playgroud)