Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Распаковка неполного архива zlib. (http://www.flasher.ru/forum/showthread.php?t=149196)

Aquahawk 20.01.2011 17:18

Распаковка неполного архива zlib.
 
Требуется загрузить swf файл как ByteArray, распаковать, и выудить некоторую информацию. Загружаю успешно, разбираю хедер флешки, беру остаток и делаю uncompress() (документация). Если флешка полная, то она нормально распаковывается, но если она с оторванным хвостом то uncompress() сообщает об ошибки декомпрессии. При том даже будучи неполной флешка нормально играется если её запустить, т.к. флеш заточен под воспроизведение неполных файлов. Т.е. она валидная но неполная. Мне надо распаковать то что есть. Алгоритм сжатия у флешек zlib deflate который позволяет такое сделать. Есть идеи как такое можно сделать? Очень уж не хочется сторонний код на as3 цеплять с реализацией deflate, т.к. будет существенно медленнее и по объёму больше.

gloomyBrain 20.01.2011 17:36

Цитата:

уж не хочется сторонний код на as3 цеплять с реализацией deflate
deflate уже реализован в классе ByteArray

Цитата:

Если флешка полная
Поясните, что Вы имеете ввиду?

Aquahawk 20.01.2011 18:08

Цитата:

Сообщение от gloomyBrain (Сообщение 966294)
deflate уже реализован в классе ByteArray

Я знаю, даже спеку указал.


Цитата:

Сообщение от gloomyBrain (Сообщение 966294)
Поясните, что Вы имеете ввиду?

Есть флешка на 10 мегабайт которая показывает картинки, то если от неё отрезать с хвоста пару мегабайт, она будет прекрасно работать, хотя хвост потерян. Флешплееру пофиг на отсутствие конца файла. А если попробовать распаковать такую флешку то uncompress будет ругаться. Вот в чём вопрос. А мне надо распаковать.

gloomyBrain 20.01.2011 18:58

Ну тогда вариант только один - парсить по одному тегу
я имею ввиду не swf-теги, а по deflate идти ручками

Aquahawk 20.01.2011 20:02

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

Psycho Tiger 20.01.2011 20:44

Конкретно с флешкой - Блуд давно мне говорил, что Loader грузит потоком и с него можно считывать байты ещё до конца загрузки. Сий спец-эффект мне повторить, к сожалению, не удалось. Но кто знает, возможно просто мне не повезло. Покопайте в этом направлении.

gloomyBrain 20.01.2011 21:13

И смысл в таком копании? Loader#loadBytes() сначала все распакует, а потом отобразит. А доступ к байтам ничем не поможет. Мне непонятно только - зачем загружать кусочек флешки и пытаться его отобразить?

wvxvw 20.01.2011 21:28

На сколько я понимаю, флешевыми функциями этого не сделать, но, с другой стороны, я видел реализацию на C#, и она совсем не большая. Так что скорее всего - писать самому / портировать.

etc 21.01.2011 00:41

Вроде бы у Loader по мере загрузки можно дергать bytes.

Psycho Tiger 21.01.2011 00:51

Цитата:

Сообщение от etc (Сообщение 966424)
Вроде бы у Loader по мере загрузки можно дергать bytes.

У меня не получается вот.
Попробуй ты :D

dimarik 21.01.2011 15:48

Денис, я пытался. В FP10 длина bytes равна нулю, пока не загрузится. В FP9 - uint.MAX_VALUE.

etc 22.01.2011 14:34

Цитата:

Сообщение от dimarik (Сообщение 966599)
Денис, я пытался. В FP10 длина bytes равна нулю, пока не загрузится. В FP9 - uint.MAX_VALUE.

А внутри есть чего?

Psycho Tiger 22.01.2011 18:39

Цитата:

Сообщение от etc (Сообщение 966808)
А внутри есть чего?

Эээ.. внутри ByteArray с length=0? Думаешь геттер косячит? Надо бы проверить...

etc 22.01.2011 18:46

Ну да, а почему бы ему не покосячить?

dimarik 24.01.2011 10:19

Девятка падает при попытке прочитать bytes до полной загрузки. Десятка, т.к. там length=0 ничего не отдает.

alatar 24.01.2011 11:56

А если использовать URStream и loadBytes?

Psycho Tiger 24.01.2011 13:43

URLStream :)

Мы о другом. О расжатии до полной загрузки.

alatar 24.01.2011 13:46

Цитата:

Мы о другом. О расжатии до полной загрузки.
Цитата:

Девятка падает при попытке прочитать bytes до полной загрузки. Десятка, т.к. там length=0 ничего не отдает.
Что будет после COMPLETE в Loader#bytes, если ему скормить байты из URStream до полной загрузки.

Psycho Tiger 24.01.2011 14:05

RTE будет, невалидный SWF, если он не полный.

NumpuT 24.01.2011 14:17

Цитата:

Сообщение от wvxvw (Сообщение 966358)
Так что скорее всего - писать самому / портировать.

А как портировать?

Aquahawk 24.01.2011 14:41

Psycho Tiger, RTE не будет, Loader нормально загрузит пол флешки и будет показывать, проверял. В том и фича deflate и формата swf что он нормально открывается и проигрывается если там половина файла. (естественно проигрывается только первая половина ролика). Скормить лоадеру и получить bytes идея хорошая, но мне необходимо попатчить флешку перед передачей лоадеру, иначе на загрузке он падает.

alatar после COMPLETE в Loader#bytes будут байты которые загрузили. Не проверял пакованные или нет, но мне нельзя отдавать флешку лоадеру сразу, сначала надо распаковать, поправить, потому уже лоадеру кормить.

Добавлено через 1 минуту
Цитата:

Сообщение от NumpuT (Сообщение 967390)
А как портировать?

руками, брать код на C++ например и переписывать на as3.

alatar 24.01.2011 14:46

Цитата:

после COMPLETE в Loader#bytes будут байты которые загрузили.
Это был не вопрос :)

NumpuT 24.01.2011 14:53

Цитата:

Сообщение от Aquahawk (Сообщение 967404)
Добавлено через 1 минуту
руками, брать код на C++ например и переписывать на as3.

C++ != as3

Aquahawk 24.01.2011 15:16

Цитата:

Сообщение от NumpuT (Сообщение 967416)
C++ != as3

Я в курсе. Берёте алгоритм на одном языке, читаете понимаете и по аналогии сами пишете на as3 это и называется портирование.

Psycho Tiger 24.01.2011 15:17

Тестить лень, но поверю на слово.
Спасибо, не знал.

alatar 24.01.2011 15:24

Цитата:

Тестить лень
Можно и не тестить. Если бы был RTE, то у нас не было бы прелоадеров в первом кадре. swf начинает исполняться до полной загрузки.

Psycho Tiger 24.01.2011 15:40

Цитата:

Сообщение от alatar (Сообщение 967430)
Можно и не тестить. Если бы был RTE, то у нас не было бы прелоадеров в первом кадре. swf начинает исполняться до полной загрузки.

Это другое. Там не происходит loadBytes по каждому PROGRESS.

Я имел ввиду что в loadBytes стояла проверка на валидность входящих данных, таких как валидность. Почему-то думал что оное распространяется и на неполный архив.

wvxvw 24.01.2011 19:55

Если портировать, то вот есть: http://code.google.com/p/flashdevelo...%2FCompression лучше / хуже - не знаю, просто случайно знаю, что тут был :)


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

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