Справочник по языку ActionScript 3.0 и его компонентам говорит что: "Класс ByteArray предназначен для опытных разработчиков, которым требуется доступ к данным на уровне байт.". А если по проще, то "Экземпляр класса ByteArray содержит в себе массив байтов".
Например, загружая файл с помощью экземпляра класса flash.net.URLLoader, в его свойстве data мы можем получить бинарное содержимое файла в виде экземпляра класса flash.utils.ByteArray.
Работая над очередным редактором графики, столкнулся с тем, что как-то нужно сохранять набор изображений и других элементов в одном файле. Естественно, выбор пал на текстовые .xml-файлы. Теперь стал вопрос:
Как бинарные данные изображения преобразовать в текстовую строку?
Ответ пришел быстро: «Нужно в цикле, по байтам, пробежаться по массиву c бинарными данными, преобразовывая каждый байт в 16-тиричный вид, и добавляя его в результирующую строку».
Оказалось, в интернете уже есть готовые решения этой задачи. На сайте Ion's Den представлен замечательный класс StringBytes.As, за что автору огромное спасибо.
package ion.utils { import flash.utils.ByteArray; public class StringBytes { public static function toString(ba:ByteArray):String { var acum:String = ""; ba.position = 0; while (ba.position < ba.length) { var dat:String = ba.readUnsignedByte().toString(16); while (dat.length < 2) dat = "0" + dat; acum += dat; } ba.position = 0; return acum; } public static function toByteArray(str:String):ByteArray { if (str.length % 2 != 0) return null; var ba:ByteArray = new ByteArray(); for (var i:int = 0; i < str.length; i += 2) { var num:int = parseInt("0x" + str.substr(i, 2)); ba.writeByte(num); } ba.position = 0; return ba; } } }
А также пример использования:
import ion.utils.StringBytes; var str:String = StringBytes.toString(myByteArray); //the string must have a even ammount of characters (each two characters represent a hexadecimal number) var ba:ByteArray = StringBytes.toByteArray("aa99cc");
Дополнительный материал
С появлением класса flash.utils.ByteArray во Flash Player'е стало возможно работать с теми файлами, с которыми казалось бы это невозможно. В интернете появилось множество Decoder'ов и Encoder'ов для различных расширений файлов. Вот список некоторых сайтов, на которых они представлены:
Дополните список в комметариях.
Обновление
Максим Slon_vsapogah подсказал (за что ему огромное спасибо), что лучше записывать байты в строку не 16-тиричном виде, а в Base64. Действительно, объем полученной строки уменьшится. Найти готовый Encoder и Decoder в Base64, также не составило труда. На сайте Dynamic Flash, имеется ссылка на архив с классом и подробная информация, как им пользоваться.
Для этой задачи всегда использовался base64, объем информации при этом увеличивается в полтора раза.
ОтветитьУдалитьВо сколько раз увеличивает объем Ваш метод?
P.S: Редактор комментариев ебанутый, не дает пользоваться стрелками вперед/назад/вниз/вверх на клавиатуре :( Также не дает скопировать текст из поля ввода. Пиздец!
Да, ты прав. Base64 будет выгоднее по объему, что-то я сразу и не сообразил :) Описанный выше метод, естественно увеличивает объем на больше, чем с Base64, в два раза почти.
ОтветитьУдалитьP.S: Пока блог живет на Blogger.com, сделать с этим ничего не могу. Даже вырезать мат ;). Приношу свои извинения за доставленные неудобства.
Спасибо очень пригодилось...
ОтветитьУдалитьА чем Вас не устроил имеющийся во фреймворке Энскодер/Декодер? ( mx.utils.Base64Encoder, mx.utils.Base64Decoder )
ОтветитьУдалитьРечь шла о чистом AS3-проекте без использования Flex-библиотек.
ОтветитьУдалить