Просмотр полной версии : ByteArray > compress toString > decompress ??? (или обратимость сжатия через строку)
каким образом это можно реализовать обратимость сжатия? я пробовал так:
var b:ByteArray = new ByteArray();
b.writeUTF("hello world");
b.compress();
var s:String = b.toString();
b.length = 0;
b.writeUTF(s);
b.uncompress(); // ошибка
var b:ByteArray = new ByteArray();
b.writeUTFBytes("hello world");
b.compress();
trace(b.length);
b.uncompress();
trace(b.length);
trace(b.readUTFBytes(b.length));
lowka, этото понятно, а как через строку то?
скажем мне нужно отправить сжатую строку на сервер, и её же получить и расжать.
А что, сервер выдает данные в бинарном виде, которые можно загрузить через URLLoader или URLStream и распаковать. А потом прочитывать UTF8.
да, это я видел в связке AS3 + AMFPHP
идем дальше: что если данные сжимаются на стороне сервера, скажем с помощью gzcompress ?
результаты сжатия с ByteArray.compress почему то отличаются..
пример сжатия "hello world"
flash: xÚcàÎHÍÉÉW(Ï/ÊI
php: xÚËHÍÉÉW(Ï/ÊI
! не все символы отображаются
существует ли решение этой проблемы?
ыы, посравнивал тут коды символов сжатия, закономерность есть)
вообщем сжать в пхп и распаковать во флеше реально! )
поизучаю еще, если получится написать конвертер, сообщу немедленно
Для начала надо перестать просматривать подобным образом контент.
я имел ввиду hex коды.
короче схожесть с увеличением строк куда то пропадает, возможно как то не так конвертирую символы.
ведь аналог charCodeAt в php далеко не ord ?
отлично, со схожестью почти разобрался, оказывается надо использовать writeMultiByte c подходящей кодировкой
Опытным путем было установлено, что сжимать в php нужно с уровнем 9 и во Flash пропустить первые три байта полученного bytearray (позже выяснилось, что это не нужно, это просто три байта UTF-8 BOM затесались).
<?php
$str = gzcompress('it is a good day to die', 9);
echo $str;
?>
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest('http://php/zlib/?test='+Math.random());
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(request);
var completeHandler:Function = function(event:Event):void {
var ba:ByteArray = event.target.data;
var ab:ByteArray = new ByteArray();
ab.writeMultiByte('it is a good day to die','x-ansi');
ab.compress();
trace(ab,ab.length, ab[3].toString(16));
trace(ba,ba.length, ba[3].toString(16));
ba.uncompress();
trace(ba);
}
loader.addEventListener(Event.COMPLETE, completeHandler);
Не уверен, что сие есть правильное решение, но переваривает строки довольно длинные без особых проблем.
урааа)
и так, решение (не думал что всё так просто):
PHP:
<?php
$s = "lorem ipsum";
$z = gzcompress($s, 9);
echo $z;
?>
AS3:
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("http://localhost/test.php");
loader.addEventListener(Event.COMPLETE, completeHandler);
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(request);
function completeHandler(e:Event) {
var b:ByteArray = loader.data;
b.uncompress();
trace(b.toString()); // lorem ipsum
}
Хм, видимо, у меня что-то непонятное затесалось в первые три байта.
UPD: Ах да, у меня просто UTF-8 BOM в начале файла был, поэтому и пропускал три байта. В общем, проблем нет.
з.Ы. toString в трейсе необязателен.
ладно подытожим этот вопрос первым вполне перспективным проектом:
онлайн сжиматель трафика на флеше =)
смотрите последний пост, ссылка начинается на fs-soyuz
http://neelts.livejournal.com/
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.