我试图理解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操作。
感谢。
答案 0 :(得分:5)
是否可以将空字节写入ByteArray()?
当然是。 ByteArray
- 是一大块原始数据。你可以在那里写任何你喜欢的东西,你可以以任何你喜欢的方式阅读(使用零字节作为分隔符或你可能想做的任何其他事情)。
使用trace()
将字节发送到标准输出时所看到的内容,完全取决于您对数据的实际操作,将其转换为字符串。有几种方法可以将字节数组转换为字符串。因此,您的问题缺少Util.print()
方法的解释。
以下是将字节转换为字符串的几个选项:
ByteArray.readUTFBytes()
相同。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函数可以将它用作字符串终止符。