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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 09.12.2009, 17:46
DEAFFF вне форума Посмотреть профиль Отправить личное сообщение для DEAFFF Посетить домашнюю страницу DEAFFF Найти все сообщения от DEAFFF
  № 1  
Ответить с цитированием
DEAFFF
 
Аватар для DEAFFF

Регистрация: Feb 2004
Адрес: Россия, В. Новгород
Сообщений: 255
Отправить сообщение для DEAFFF с помощью ICQ
По умолчанию как прочесть и записать u30 число?

вопрос к профессионалам

делаю небольшой декомпилятор на ас3, дошел уже до ABC тега
там в принципе не сложно, но есть какие то числа:
Цитата:
The type u30 represents a variable-length encoded 30-bit unsigned integer value.
The types u32 and s32 represent variable-length encoded 32-bit unsigned and signed integer values respectively.
Это выдержка из доки официальной.
http://www.adobe.com/devnet/actionsc...m2overview.pdf

есть достаточно похожий опенсорс проект swfutils
http://swfutils.riaforge.org/

но к сожалению там тока чтение этих чисел, например u30 у них читается так:

Код AS3:
public function readEU32():uint
{
	var result:uint = _dataInput.readUnsignedByte();
		if (!(result & 0x00000080))
			return result;
	result = (result & 0x0000007f) | _dataInput.readUnsignedByte()<<7;
		if (!(result & 0x00004000))
			return result;
	result = (result & 0x00003fff) | _dataInput.readUnsignedByte()<<14;
		if (!(result & 0x00200000))
			return result;
	result = (result & 0x001fffff) | _dataInput.readUnsignedByte()<<21;
		if (!(result & 0x10000000))
			return result;
	return (result & 0x0fffffff) | _dataInput.readUnsignedByte()<<28;
};
я не особо силен в булевых вычислениях... как записать подобное число? и где можно об этом почитать?
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир...

Старый 09.12.2009, 18:53
bicubic_bublic вне форума Посмотреть профиль Найти все сообщения от bicubic_bublic
  № 2  
Ответить с цитированием
bicubic_bublic
Banned
[+4 25.09.09]
[+1 12.11.09]
[+4 12.12.09]

Регистрация: Sep 2009
Сообщений: 231
оттуда же:
Цитата:
The variable-length encoding for u30, u32, and s32 uses one to five bytes, depending on the magnitude of the
value encoded. Each byte contributes its low seven bits to the value. If the high (eighth) bit of a byte is set,
then the next byte of the abcFile is also part of the value. In the case of s32, sign extension is applied: the
seventh bit of the last byte of the encoding is propagated to fill out the 32 bits of the decoded value.
Добавлено через 6 минут
Код AS3:
function writeU32(ba:ByteArray, value:uint) {
   if (value == 0) {
      ba.writeByte(0);
   }
   var byte:uint;
   while (value != 0) {
      byte = value & 0x0000007f; // отрезаем 7 бит от числа
      value = value >> 7; //смещаем на 7 бит
      if (value != 0) { //если что-то еще осталось добавляем 8-й бит флаг
         byte = byte | 0x00000080;
      }
      ba.writeByte(byte); //пишем текущий байт..
   }
}


Последний раз редактировалось bicubic_bublic; 09.12.2009 в 19:02.
Старый 09.12.2009, 19:59
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 3  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Код AS3:
    public function readASInt():int {
        var result:uint = 0;
        var i:uint = 0, byte:uint;
        do {
            byte = super.readUnsignedByte();
            result |= ( byte & 0x7F ) << ( i*7 );
            i+=1;
        } while ( byte & 1<<7 );
        return result;            
    }

Старый 09.12.2009, 20:46
DEAFFF вне форума Посмотреть профиль Отправить личное сообщение для DEAFFF Посетить домашнюю страницу DEAFFF Найти все сообщения от DEAFFF
  № 4  
Ответить с цитированием
DEAFFF
 
Аватар для DEAFFF

Регистрация: Feb 2004
Адрес: Россия, В. Новгород
Сообщений: 255
Отправить сообщение для DEAFFF с помощью ICQ
ооо спасибо ребята!!!
а что на счет u32 и s32? интересует чтение и запись...
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир...

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

Регистрация: Sep 2002
Сообщений: 30,784
u32 и s32 можно прочитать стандартными методами ByteArray.

Старый 09.12.2009, 21:11
DEAFFF вне форума Посмотреть профиль Отправить личное сообщение для DEAFFF Посетить домашнюю страницу DEAFFF Найти все сообщения от DEAFFF
  № 6  
Ответить с цитированием
DEAFFF
 
Аватар для DEAFFF

Регистрация: Feb 2004
Адрес: Россия, В. Новгород
Сообщений: 255
Отправить сообщение для DEAFFF с помощью ICQ
это то я понимаю )))
я имею ввиду эти два
The types u32 and s32 represent variable-length encoded 32-bit unsigned and signed integer values respectively.
они подобны u30 на сколько я понял
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир...

Старый 09.12.2009, 21:17
bicubic_bublic вне форума Посмотреть профиль Найти все сообщения от bicubic_bublic
  № 7  
Ответить с цитированием
bicubic_bublic
Banned
[+4 25.09.09]
[+1 12.11.09]
[+4 12.12.09]

Регистрация: Sep 2009
Сообщений: 231
Цитата:
Сообщение от DEAFFF Посмотреть сообщение
это то я понимаю )))
я имею ввиду эти два
The types u32 and s32 represent variable-length encoded 32-bit unsigned and signed integer values respectively.
они подобны u30 на сколько я понял
для u32 чтения/записи можно использовать те же самые функции что и для u30

Цитата:
u32 и s32 можно прочитать стандартными методами ByteArray.
вот для s32 немного другая тема.. кстати он не считивается стандартным ByteArray'ем (впрочем как и u32)

Добавлено через 6 минут
Код AS3:
function writeS32(ba:ByteArray, value:int):void {
   if (value >= 0) {
      writeU32(ba, value);
      return;
   }
   var len:uint = 0;
   var abs:uint = - value; // абсолютное значение value;
   while (abs != 0) { // длина в битах абсолютного значения
      abs = abs >> 1;
      len++;
   }
   abs = - value;
   var signBytePos:uint = Math.floor(len / 7) + 1; // длина s32, порядковый номер байта в котором содержится знак-бит;
   while (signBytePos-- != 0) {
      byte = abs & 0x0000007f; // отрезаем 7 бит от числа
      abs = abs >> 7; //смещаем на 7 бит
      if (signBytePos != 0) { //если что-то еще осталось добавляем 8-й бит флаг
         byte = byte | 0x00000080;
      } else { //последний байт - добавляем знак-бит
         byte = byte | 0x00000040;
      }
      ba.writeByte(byte); //пишем текущий байт..
   }
}
возможно перепутал со знаком..


Последний раз редактировалось bicubic_bublic; 09.12.2009 в 21:52.
Старый 09.12.2009, 21:54
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
bicubic_bublic, s32 вообще-то обычный writeInt/readInt. Единственное, что нужно читать ручками — u30.

Старый 09.12.2009, 21:56
bicubic_bublic вне форума Посмотреть профиль Найти все сообщения от bicubic_bublic
  № 9  
Ответить с цитированием
bicubic_bublic
Banned
[+4 25.09.09]
[+1 12.11.09]
[+4 12.12.09]

Регистрация: Sep 2009
Сообщений: 231
Цитата:
Сообщение от etc Посмотреть сообщение
bicubic_bublic, s32 вообще-то обычный writeInt/readInt. Единственное, что нужно читать ручками — u30.
s32 - от 1 до 5 байт
readInt - считывает 4 байта

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

Регистрация: Feb 2004
Адрес: Россия, В. Новгород
Сообщений: 255
Отправить сообщение для DEAFFF с помощью ICQ
спасибо! ))) буду пробовать
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир...

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

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

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


 


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


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