PDA

Просмотр полной версии : Записать байткод


gloomyBrain
07.08.2009, 22:46
Здравствуйте
Второй день сижу над спецификацией формата swf и глаза, соответственно, немного в кучу =)
Собственно, страшного (вроде) в нем ничего нет... НО
Если кто-нибудь имел с ним дело, подскажите пожалуйста, как правильно записать весь этот ужас в байткод - я имею в виду формат записи чисел:
UI8
UI16
SI8
SI8[n]
...
...
и т.д. и т.п.

ЗЫ
Вдруг захотелось сгенерировать одной флешкой другую флешку =))

ЗЗЫ
я и сам понимаю, что много хочу, и поэтому буду рад любым подсказкам/ наводкам/ ссылкам

wvxvw
08.08.2009, 05:40
UI8 - writeByte()
UI16 - writeShort()
SI8 - writeByte()
SI8[n] - не знаю что такое :)
Проблематичнее когда нужно записывать биты, очень длинные числа, или числа с компрессией - я с последними двумя так и не разобрался до конца.

Alex Lexcuk
08.08.2009, 09:58
>>Вдруг захотелось сгенерировать одной флешкой другую флешку =))
а, чего должно быть в сгенеренной флешке?
Если сгенереннные флешки однотипны, те. должны меняться только какие-то отдельные данные, не думаю, что ваша цель сделать компилятор флеша на флеше.
То можно поступить так, сделать флешку шаблон, в которой оставить место под эти меняющиеся данные, те. флешка с длинной строкой, строку можно забить хоть так:

var s:String='11111111111111111111111111111111111111111111111111';

пару килобайт единиц должно хватить, теперь компилим флешку шаблон, так, что-бы у нее в выходном swf файле были несжатые данные, во флеш cs3 для этого достаточно снять галку с []compress movie.
Ембедим флешку-шаблон во флешку генератор флешек, и вот пользователь чето рисует, тягает или пишет, нажимает на кнопку сохранить как swf, ищем во флешке шаблоне единицы, или берем положение единиц из константы и заменяем единицы на данные, которые натворил пользователь. Ну, а дальше save.

gloomyBrain
08.08.2009, 15:46
Ну вообще-то я именно хочу сделать компилятор флеша на флеше =)
ШУЧУ
Я хочу добиться примерно вот такого функционала:
1- Выбрали картинку на рабочем столе (FileReference)
2- Выбрали mp3 звук ... все так же точно
3- Выбрали другую swf с анимацией, звуками и т.д.
4- Распарсили swf(из пункта 3) на байткод, вынули оттуда имена и содержимое классов (то есть других картинок, звуков и swf - ... маленькая такая рекурсия =) )
5- зарегистрировали полученные классы, отобразили это графически и выбрали, что в нашей библиотеке должно остаться, а заодно и прописали новые className всем элементам
6- FileReference.save()

Все очень просто и очень сложно одновременно
На выходе - удобный инструмент для быстрого создания и редактирования swf-библиотек (без использования Flash вообще, что, ИМХО, +1)

2 AlexLexcuk
ну в общем-то примерно так... Создать начало, создать конец, а середину генерировать
во флеш cs3 для этого достаточно снять галку с []compress movie
А где такая галка во FlashDevelop ???
UPD:
нашел: Project -> Properties -> вкладка Compiler Options -> Optimize bytecode

2 wvxvw
Проблематичнее когда нужно записывать биты, очень длинные числа, или числа с компрессией - я с последними двумя так и не разобрался до конца.
Я вообще с самого начала не понимаю как это сделать =)

PS
На самом деле для меня сейчас важен вот такой вопрос: как из числа 4 получить число 0x04 (как его так отобразить???)
Потому как читая спецификацию swf заметил, что там все именно так и записывается (с такой записью удобнее выстраивать байты по старшинству там, где это необходимо)

etc
08.08.2009, 15:52
Пункт 3 я уже когда-то делал:
http://etcs.ru/pre/ResourceThiefExample/

:D

gloomyBrain
08.08.2009, 16:50
etc, спасибо за ссылку
В общем-то идея и родилась, глядя на строчку getDefinitionNames() =)
Вы не будете против, если я использую для экспериментов часть Вашего кода?

etc
08.08.2009, 16:58
Да пожалуйста.

toFlash
21.09.2009, 18:54
На выходе - удобный инструмент для быстрого создания и редактирования swf-библиотек (без использования Flash вообще, что, ИМХО, +1)


увенчались эксперименты успехом? интересно было бы посмотреть!

etc
21.09.2009, 18:57
ResourceThief надо апгрейдить, там косяков выше крыши, на половине флешек валится в хлам. :(

flash33
21.09.2009, 21:24
gloomyBrain, это Вам надо подробно изучать спецификацию SWF v9-10, потому что просто так из байткода графический элемент или звук не выкинешь. Весь байткод это цепочка тегов, в каждом описан один элемент, а заголовок тега указывает на его длину, то есть не как в xml - тег открылся - тег закрылся, конец надо вычислять, и если какой то тег выбрасывать, то соответственно все заголовки надо переписывать. etc, я прально говорю?

dimarik
21.09.2009, 21:41
не, только file attributes (69)

wvxvw
21.09.2009, 22:51
gloomyBrain, это Вам надо подробно изучать спецификацию SWF v9-10, потому что просто так из байткода графический элемент или звук не выкинешь. Весь байткод это цепочка тегов, в каждом описан один элемент, а заголовок тега указывает на его длину, то есть не как в xml - тег открылся - тег закрылся, конец надо вычислять, и если какой то тег выбрасывать, то соответственно все заголовки надо переписывать. etc, я прально говорю?

Не, не совсем так. Теги по большей части независимы друг от друга, исключение только те, которые ссылаются на символы. Единственная проверка на "целостность" SWF - это 4 байта, где указывается длина файла. Т.е. если, например, нужно выбросить какой-нибудь PlaceObject - то это можно сделать практически безболезненно, только длину нужно будет проапдейтить. Но если начать возится с символами / DoABC - то там уже больше зависимостей и сложнее поменять.

etc
22.09.2009, 08:01
gloomyBrain, это Вам надо подробно изучать спецификацию SWF v9-10, потому что просто так из байткода графический элемент или звук не выкинешь. Весь байткод это цепочка тегов, в каждом описан один элемент, а заголовок тега указывает на его длину, то есть не как в xml - тег открылся - тег закрылся, конец надо вычислять, и если какой то тег выбрасывать, то соответственно все заголовки надо переписывать. etc, я прально говорю?
Нет, можно выкинуть один тег и просто поменять длину в заголовке файла. Ничего больше делать не нужно.

flash33
22.09.2009, 12:07
Спасибо, давно не лазил и все забыл :)