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 может использовать его как терминатор строки.