2

ByteArray の null バイトの意味を理解しようとしています。彼らはターミネーターのように振る舞いますか?つまり、null バイトが書き込まれると、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 が表示されます。

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

私が質問する理由は、ActionScript コードで、null バイトが書き込まれた後でも ByteArray に対して多くの writeInt 操作と writeByte 操作が実行されることを確認したためです。

ありがとう。

4

2 に答える 2

5

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

もちろん。ByteArray--は生データのチャンクです。そこには好きなように書くことができ、好きなように読むことができます(区切り文字としてゼロバイトを使用するなど、やりたいことは何でもできます)。

を使用してバイトを標準出力に送信したときに表示trace()される内容は、データを文字列に変換するために実際に何を行うかにのみ依存します。バイトの配列を文字列に変換する方法はいくつかあります。したがって、あなたの質問には、Util.print()メソッドが何をするかについての説明がありません。

バイトを文字列に変換するためのいくつかのオプションを次に示します。

  • バイトと出力文字をループします。エンコーディングはあなた次第です。
  • ByteArray.readUTFBytes()を使用して文字列を読み取ります。このメソッドは、utfでエンコードされたシンボルを読み取ります。ゼロ文字に遭遇すると停止します。
  • ByteArray.readUTF()を使用して文字列を読み取ります。このメソッドでは、文字列の前に、その長さを示すunsignedshortが付いている必要があります。言い換えれば、それはと同じByteArray.readUTFBytes()です。
  • ByteArray.toString()を使用します。これはあなたが単にするときに起こることですtrace(byteArray);。このメソッドはゼロバイトを無視し、残りを出力します。このメソッドは、System.useCodePage設定を使用してエンコードを決定し、データがそれで始まる場合はUTFBOMを使用できます。

上記を説明するいくつかのテストを次に示します。

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 を書き込むことは意味がありません。ただし、印刷機能は文字列ターミネータとして使用する場合があります。

于 2012-05-13T10:46:25.717 に答える