Блог от AS3Coder'a о JavaScript, HTML, CSS... и немного о Flash.

четверг, 11 февраля 2010 г.

Как преобразовать бинарные данные ByteArray в текстовую строку String

Что такое ByteArray?

Справочник по языку 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, имеется ссылка на архив с классом и подробная информация, как им пользоваться.
           

5 комментариев:

  1. Для этой задачи всегда использовался base64, объем информации при этом увеличивается в полтора раза.

    Во сколько раз увеличивает объем Ваш метод?

    P.S: Редактор комментариев ебанутый, не дает пользоваться стрелками вперед/назад/вниз/вверх на клавиатуре :( Также не дает скопировать текст из поля ввода. Пиздец!

    ОтветитьУдалить
  2. Да, ты прав. Base64 будет выгоднее по объему, что-то я сразу и не сообразил :) Описанный выше метод, естественно увеличивает объем на больше, чем с Base64, в два раза почти.

    P.S: Пока блог живет на Blogger.com, сделать с этим ничего не могу. Даже вырезать мат ;). Приношу свои извинения за доставленные неудобства.

    ОтветитьУдалить
  3. Спасибо очень пригодилось...

    ОтветитьУдалить
  4. А чем Вас не устроил имеющийся во фреймворке Энскодер/Декодер? ( mx.utils.Base64Encoder, mx.utils.Base64Decoder )

    ОтветитьУдалить
  5. Речь шла о чистом AS3-проекте без использования Flex-библиотек.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например <b>, <i>, <a>

Поиск по блогу

Обо мне



Farid Shamsutdinov (AS3Coder)
Russia, Tatarstan, Kazan
as3coder@gmail.com

Подробнее...

Постоянные читатели

© 2014 Farid Shamsutdinov. При копировании материалов, ссылка на источник обязательна. Технологии Blogger.