2012-05-13 37 views
1

我想了解ByteArray中空字节的意义。他们是否像终结者一样行事?我的意思是,一旦空字节被写入,我们不能进一步写入ByteArray吗?ActionScript 3.0 - 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; 

这给出了一个空白的输出。现在

,如果我更换DWORD,0x18101000与0x18101010,这时候我可以看到ASCII填充,ABCD输出。

我的问题是,是否有可能通过空字节写入ByteArray()?

我之所以这样问,是因为我在ActionScript代码已经看到,很多writeInt和writeByte操作都是在空字节写入即使后的ByteArray进行。

谢谢。

回答

4

是有可能写过去的空字节到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 
+0

谢谢。我会尝试你的建议,并考察从ByteArray中读取的各种函数。一个问题,我正在使用:http://eval.hurlant。com/demo /来练习ActionScript。它不支持trace()吗?因为我无法在其中使用trace()查看输出。 –

+0

不知道,其实。我认为,用现实世界的工具练习会更好。 [Flex SDK](http://www.adobe.com/devnet/flex/flex-sdk-download.html)是免费的(编译器+一堆工具)和[Flash开发](http://www.flashdevelop .org /)也是免费的(一个使用Flex SDK编译ActionScript的IDE)。 –

+0

谢谢。我会检查出来。 –

1

据我所知,将一个空值写入字节数组没有任何意义。打印功能可能会将其用作字符串终止符。

+0

感谢。我明白那个。所以,问题出在打印功能上。我需要使用替代方法来读取写入空字节的ByteArray的输出。 –