2

我试图了解 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 操作。

谢谢。

4

2 回答 2

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
于 2012-05-13T14:01:28.723 回答
1

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

于 2012-05-13T10:46:25.717 回答