2012-05-13 22 views
1

ByteArrayのnullバイトの重要性を理解しようとしています。彼らはターミネーターのように行動しますか?つまり、一度nullバイトが書き込まれると、ByteArrayに書き込むことはできませんか?例えばActionScript 3.0 - ByteArrayのNullバイト

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; 

これは空白の出力が得られます。

ここで、0x18101000というDWORDを0x18101010に置き換えた場合、今回はASCIIパディングのABCDが出力に表示されます。

私の質問は、nullバイトを超えてByteArray()に書き込むことは可能ですか?

ActionScriptコードでは、nullバイトが書き込まれた後でも、多くのwriteIntおよびwriteByte操作がByteArrayで実行されるため、私が尋ねる理由があります。

ありがとうございました。

答えて

4

ByteArray()にヌルバイトを書き込むことは可能ですか?もちろん

ことがあります。 ByteArray - 生データのチャンクです。あなたはそこに好きなものを書くことができ、好きな方法で読み込むことができます(区切り文字として0バイトを使うなど、何でもしたいことがあります)。

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から読み込むために用意されているさまざまな関数を調べます。 1つの質問、私は使用しています:http://eval.hurlant。com/demo /を使ってActionScriptを練習しましょう。 trace()をサポートしていませんか?私はその中でtrace()を使って出力を見ることができないからです。 –

+0

実際は考えていません。私は、実世界のツールを使って練習するほうがよいと思います。 [Flex SDK](http://www.adobe.com/devnet/flex/flex-sdk-download.html)は無料(コンパイラ+ツール一式)、[Flash Develop](http://www.flashdevelop .org /)も無料です(IDE、Flex SDKを使用してActionScriptをコンパイルする)。 –

+0

ありがとうございます。私はそれらをチェックアウトします。 –

1

バイト配列にnullを書き込むことは、私が知る限り重要な意味を持ちません。ただし、print関数は、文字列ターミネータとして使用できます。

+0

おかげで。という事は承知しています。だから問題は、印刷機能であった。 ByteArrayの出力をnullバイトで記述したものを読み込むには、別の方法を使用する必要があります。 –

関連する問題