PDA

Просмотр полной версии : ByteArray > compress toString > decompress ??? (или обратимость сжатия через строку)


neelts
29.07.2007, 18:29
каким образом это можно реализовать обратимость сжатия? я пробовал так:



var b:ByteArray = new ByteArray();
b.writeUTF("hello world");
b.compress();
var s:String = b.toString();
b.length = 0;
b.writeUTF(s);
b.uncompress(); // ошибка

lowka
29.07.2007, 18:53
var b:ByteArray = new ByteArray();
b.writeUTFBytes("hello world");
b.compress();
trace(b.length);
b.uncompress();
trace(b.length);
trace(b.readUTFBytes(b.length));

neelts
29.07.2007, 19:06
lowka, этото понятно, а как через строку то?
скажем мне нужно отправить сжатую строку на сервер, и её же получить и расжать.

etc
29.07.2007, 22:17
А что, сервер выдает данные в бинарном виде, которые можно загрузить через URLLoader или URLStream и распаковать. А потом прочитывать UTF8.

neelts
29.07.2007, 22:41
да, это я видел в связке AS3 + AMFPHP

идем дальше: что если данные сжимаются на стороне сервера, скажем с помощью gzcompress ?

результаты сжатия с ByteArray.compress почему то отличаются..

пример сжатия "hello world"

flash: xÚcàÎHÍÉÉW(Ï/ÊI

php: xÚËHÍÉÉW(Ï/ÊI

! не все символы отображаются



существует ли решение этой проблемы?

neelts
29.07.2007, 23:01
ыы, посравнивал тут коды символов сжатия, закономерность есть)

вообщем сжать в пхп и распаковать во флеше реально! )
поизучаю еще, если получится написать конвертер, сообщу немедленно

etc
29.07.2007, 23:12
Для начала надо перестать просматривать подобным образом контент.

neelts
29.07.2007, 23:57
я имел ввиду hex коды.

короче схожесть с увеличением строк куда то пропадает, возможно как то не так конвертирую символы.

ведь аналог charCodeAt в php далеко не ord ?

neelts
30.07.2007, 00:49
отлично, со схожестью почти разобрался, оказывается надо использовать writeMultiByte c подходящей кодировкой

etc
30.07.2007, 00:51
Опытным путем было установлено, что сжимать в 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);

Не уверен, что сие есть правильное решение, но переваривает строки довольно длинные без особых проблем.

neelts
30.07.2007, 01:15
урааа)

и так, решение (не думал что всё так просто):

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
}

etc
30.07.2007, 01:56
Хм, видимо, у меня что-то непонятное затесалось в первые три байта.

UPD: Ах да, у меня просто UTF-8 BOM в начале файла был, поэтому и пропускал три байта. В общем, проблем нет.

з.Ы. toString в трейсе необязателен.

neelts
30.07.2007, 13:50
ладно подытожим этот вопрос первым вполне перспективным проектом:

онлайн сжиматель трафика на флеше =)

смотрите последний пост, ссылка начинается на fs-soyuz
http://neelts.livejournal.com/