Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как прочесть и записать u30 число? (http://www.flasher.ru/forum/showthread.php?t=133638)

DEAFFF 09.12.2009 17:46

как прочесть и записать 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;
};

я не особо силен в булевых вычислениях... как записать подобное число? и где можно об этом почитать?

bicubic_bublic 09.12.2009 18:53

оттуда же:
Цитата:

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); //пишем текущий байт..
  }
}


etc 09.12.2009 19:59

Код 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;           
    }


DEAFFF 09.12.2009 20:46

ооо спасибо ребята!!!
а что на счет u32 и s32? интересует чтение и запись...

etc 09.12.2009 20:49

u32 и s32 можно прочитать стандартными методами ByteArray.

DEAFFF 09.12.2009 21:11

это то я понимаю )))
я имею ввиду эти два
The types u32 and s32 represent variable-length encoded 32-bit unsigned and signed integer values respectively.
они подобны u30 на сколько я понял

bicubic_bublic 09.12.2009 21:17

Цитата:

Сообщение от DEAFFF (Сообщение 871559)
это то я понимаю )))
я имею ввиду эти два
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); //пишем текущий байт..
  }
}

возможно перепутал со знаком..

etc 09.12.2009 21:54

bicubic_bublic, s32 вообще-то обычный writeInt/readInt. Единственное, что нужно читать ручками — u30.

bicubic_bublic 09.12.2009 21:56

Цитата:

Сообщение от etc (Сообщение 871572)
bicubic_bublic, s32 вообще-то обычный writeInt/readInt. Единственное, что нужно читать ручками — u30.

s32 - от 1 до 5 байт
readInt - считывает 4 байта

DEAFFF 09.12.2009 22:28

спасибо! ))) буду пробовать


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

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