ActionScript 3.0 - нулевые байты в ByteArray

Я пытаюсь понять значение нулевых байтов в 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;

Это дает пустой вывод.

Теперь, если я заменю DWORD, 0x18101000 на 0x18101010, на этот раз я увижу дополнение ASCII, ABCD в выходных данных.

Мой вопрос заключается в том, можно ли записать после нулевого байта в ByteArray()?

Причина, по которой я спрашиваю, состоит в том, что я видел в коде ActionScript, что многие операции writeInt и writeByte выполняются с ByteArray даже после записи нулевого байта.

Благодарю.

2 ответа

Решение

Можно ли записать после нулевого байта в 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

Насколько я знаю, запись нулевого значения в байтовый массив не имеет значения. Однако функция print может использовать его как терминатор строки.

Другие вопросы по тегам