Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.07.2009, 15:18
bugizavr вне форума Посмотреть профиль Отправить личное сообщение для bugizavr Найти все сообщения от bugizavr
  № 1  
Ответить с цитированием
bugizavr

Регистрация: Jun 2009
Сообщений: 42
По умолчанию Object to ByteArray to *.txt, then *.txt to ByteArray to Object

Доброго времени суток

у мея проблема:

дан вектор строк, нужно его перегнать в ByteArray и сжать - это работает
затем ByteArray перегнать в строку - это ВРОДЕ работает
затем эту строку перегнать в ByteArray - это ВРОДЕ работает
ByteArray разжать и перегнть в вектор строк - это НЕ рабоает

значит, как это делаю

Код AS3:
var lvlCodes:Vector.<String> = new Vector.<String>();
// инициализация lvlCodes
...
var byteArr:ByteArray = new ByteArray();
 
byteArr.writeObject(lvlCodes);
byteArr.compress();
 
byteArr.position = 0;
 
var str:String = byteArr.readUTFBytes(byteArr.length);
 
byteArr.writeUTFBytes(str);
byteArr.position = 0;
 
// тут ошибка возникает		
byteArr.uncompress();
 
lvlCodes = byteArr.readObject();
 
const len:uint = lvlCodes.length;
for (var i:uint; i < len; ++i) { trace(lvlCodes[i]); }

Старый 04.07.2009, 15:27
MonkDead вне форума Посмотреть профиль Отправить личное сообщение для MonkDead Посетить домашнюю страницу MonkDead Найти все сообщения от MonkDead
  № 2  
Ответить с цитированием
MonkDead
 
Аватар для MonkDead

Регистрация: Dec 2007
Сообщений: 204
Ошибка возникает из-за того что в byteArr (перед byteArr.uncompress()) присутствуют метаданные, сначала необходимо отделить метаданные.
Грубо говоря byteArr после byteArr.compress() не равно byteArr после byteArr.writeUTFBytes(str); Трейсами это будет сразу видно.
Вот та же самая тема http://www.flasher.ru/forum/showthre...ight=ByteArray


Последний раз редактировалось MonkDead; 04.07.2009 в 15:33.
Старый 04.07.2009, 16:00
bugizavr вне форума Посмотреть профиль Отправить личное сообщение для bugizavr Найти все сообщения от bugizavr
  № 3  
Ответить с цитированием
bugizavr

Регистрация: Jun 2009
Сообщений: 42
ага, понятно, трейсами все посмотрел, действительно есть различия
но как тделить методанные?


Последний раз редактировалось bugizavr; 04.07.2009 в 16:27.
Старый 04.07.2009, 17:48
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Интересно, как вы бинарник таким вот образом в строку загонять собрались? Строка закончится там, где он встретит нулевой байт.


Последний раз редактировалось etc; 04.07.2009 в 18:43.
Старый 04.07.2009, 18:02
bugizavr вне форума Посмотреть профиль Отправить личное сообщение для bugizavr Найти все сообщения от bugizavr
  № 5  
Ответить с цитированием
bugizavr

Регистрация: Jun 2009
Сообщений: 42
__etc - вы уверены? с с++ не путаете строки?

на самом деле, код что я представил рабочий, ещё как работает))

ошибка возникает если использовать другой экземпляр ByteArray
вот такие дела

=======================================
кто-нибудь знает как отделить метаданные?)

Старый 04.07.2009, 18:17
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Нет, не путаю. Простейший пример:
Код AS3:
var ba:ByteArray = new ByteArray();
ba.writeUTFBytes('first');
ba.writeByte(0);
ba.writeUTFBytes('second');
ba.position = 0;
var s:String = ba.readUTFBytes(ba.length);
trace(s, s.length, ba.length);
Оно у вас будет работать до тех пор, пока не встретит нулевой байт. И, судя по проблеме, именно из-за этого и не работает. Причем тут метаданные объекта для десериализации, честно говоря, не знаю.

Старый 04.07.2009, 18:20
bugizavr вне форума Посмотреть профиль Отправить личное сообщение для bugizavr Найти все сообщения от bugizavr
  № 7  
Ответить с цитированием
bugizavr

Регистрация: Jun 2009
Сообщений: 42
ага, спасибо __etc
буду разбираться

Старый 04.07.2009, 18:37
MonkDead вне форума Посмотреть профиль Отправить личное сообщение для MonkDead Посетить домашнюю страницу MonkDead Найти все сообщения от MonkDead
  № 8  
Ответить с цитированием
MonkDead
 
Аватар для MonkDead

Регистрация: Dec 2007
Сообщений: 204
Цитата:
Интересно, как вы бинарник таким вот образом в строку загонять собрались? Строка закончится там, где он встретит нулевой байт.
__etc кстати прав.

Вот набросал код под Air, возможно поможет. Открывает тестовый файл (input.txt) записывает текст в ByteArray, сжимает и сохраняет в файл (output.byt). К сожалению проверить код не могу нет под руками ПО, но код должен работать.
Код AS3:
package 
{
 
	import flash.filesystem.*; 
        import flash.utils.*; 
	import flash.display.*;
 
	public class Converter extends Sprite
	{
		public function Air() 
		{
			var bytes:ByteArray = new ByteArray(); 
			var inBytes:ByteArray = new ByteArray(); 
			this.readFile("input.txt", inBytes); 
 
                        var str:String = inBytes.toString();
                        bytes.writeUTF(str);
                        // или bytes.writeUTFByte(str);
                        // или на крайней случай bytes.writeObject(str);
                        bytes.position = 0;
                        bytes.compress(CompressionAlgorithm.DEFLATE);
                        this.outFile("output.byt", bytes); 
		}
 
		public function readFile(fileName:String, data:ByteArray):void 
		{ 
                         var inFile:File = File.desktopDirectory;
                         inFile = inFile.resolvePath(fileName);
                         var inStream:FileStream = new FileStream(); 
                         inStream.open(inFile, FileMode.READ); 
                         inStream.readBytes(data, 0, data.length); 
                         inStream.close();
			 data.position = 0;
                }
 
		public function outFile(fileName:String, data:ByteArray):void 
		{ 
                         var outFile:File = File.desktopDirectory;
                         outFile = outFile.resolvePath(fileName); 
                         var outStream:FileStream = new FileStream(); 
                         outStream.open(outFile, FileMode.WRITE); 
                         outStream.writeBytes(data, 0, data.length); 
                         outStream.close(); 
                }
	}
}
И соответственно обратный перевод
Код AS3:
public function ByteArrayToStr():void
{
	var inBytes:ByteArray = new ByteArray(); 
        this.readFile("output.byt", inBytes); 
 
        inBytes.uncompress(CompressionAlgorithm.DEFLATE);
        inBytes.position = 0;
        var str:String = inBytes.readObject(); 
        trace(str);
}


Последний раз редактировалось MonkDead; 04.07.2009 в 19:23.
Старый 04.07.2009, 18:42
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 9  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Ну я бы не сохранял бинарник в файл с расширением txt

Старый 04.07.2009, 18:45
MonkDead вне форума Посмотреть профиль Отправить личное сообщение для MonkDead Посетить домашнюю страницу MonkDead Найти все сообщения от MonkDead
  № 10  
Ответить с цитированием
MonkDead
 
Аватар для MonkDead

Регистрация: Dec 2007
Сообщений: 204
Код AS3:
Ну я бы не сохранял бинарник в файл с расширением txt
__etc, я еще не дописал код Тут с ходу кропал.

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:29.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 02:29.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.