Форум программистов, компьютерный форум, киберфорум
Наши страницы
ActionScript
Войти
Регистрация
Восстановить пароль
 
EDIsaev
4 / 4 / 2
Регистрация: 27.03.2012
Сообщений: 136
1

Перевод функции с AS3 на Delphi

06.05.2013, 13:42. Просмотров 455. Ответов 1
Метки нет (Все метки)

Доброго времени суток!
Анализировал скрипты из одной флешки, там организовано общение с сервером по TCP с использованием библиотеки protocol-buffers она для для Java, C и Python, а вот для Delphi сколько не гуглил, не нашёл.
Там при работе с кодированными потоками в основном используется такая конструкция
ActionScript 3
1
2
3
4
override public function readInt() : int
{
   return decodeZigZag32(this.readRawVarint32());
}
Вот соответственно описания:
decodeZigZag32(int n)
readRawVarint32()
Проблема в следующем, в исходниках на java по ссылке выше, видем следующий код
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public int readRawVarint32() throws IOException {
    byte tmp = readRawByte();
    if (tmp >= 0) {
      return tmp;
    }
    int result = tmp & 0x7f;
    if ((tmp = readRawByte()) >= 0) {
      result |= tmp << 7;
    } else {
      result |= (tmp & 0x7f) << 7;
      if ((tmp = readRawByte()) >= 0) {
        result |= tmp << 14;
      } else {
        result |= (tmp & 0x7f) << 14;
        if ((tmp = readRawByte()) >= 0) {
          result |= tmp << 21;
        } else {
          result |= (tmp & 0x7f) << 21;
          result |= (tmp = readRawByte()) << 28;
          if (tmp < 0) {
            // Discard upper 32 bits.
            for (int i = 0; i < 5; i++) {
              if (readRawByte() >= 0) {
                return result;
              }
            }
            throw InvalidProtocolBufferException.malformedVarint();
          }
        }
      }
    }
    return result;
  }
Читается побайтно, хотя в итоге для обычного int читается до 5 байт, вместо 4... плюс ещё до 5 может отбрасываться...
а в ActionScript она выглядит следующим образом:
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 public function readRawVarint32() : int
    {
      var _loc_3:int = 0;
      var _loc_1:* = this.readByte();
      if (_loc_1 >= 0)
      {
        return _loc_1;
      }
      var _loc_2:* = _loc_1 & 127;
      var _loc_4:* = this.readByte();
      _loc_1 = this.readByte();
      if (_loc_4 >= 0)
      {
        _loc_2 = _loc_2 | _loc_1 << 7;
      }
      else
      {
          _loc_2 = _loc_2 | (_loc_1 & 127) << 7;
          var _loc_4:* = this.readByte();
          _loc_1 = this.readByte();
          if (_loc_4 >= 0)
          {
              _loc_2 = _loc_2 | _loc_1 << 14;
          }
          else
          {
              _loc_2 = _loc_2 | (_loc_1 & 127) << 14;
              var _loc_4:* = this.readByte();
              _loc_1 = this.readByte();
              if (_loc_4 >= 0)
              {
                  _loc_2 = _loc_2 | _loc_1 << 21;
              }
              else
              {
                  _loc_2 = _loc_2 | (_loc_1 & 127) << 21;
                  var _loc_4:* = this.readByte();
                  _loc_1 = this.readByte();
                  _loc_2 = _loc_2 | _loc_4 << 28;
                  if (_loc_1 < 0)
                  {
                      _loc_3 = 0;
                      while (_loc_3 < 5)
                      {
                         if (this.readByte() >= 0)
                         {
                             return _loc_2;
                         }
                         _loc_3++;
                      }
                      throw new IllegalArgumentException();
                  }
              }
          }
      }
      return _loc_2;
    }// end function
Они по идее должны быть идентичны, но
тут получается читается в 2 раза больше байт? ПОЧЕМУ?
Или например
ActionScript 3
1
2
      var _loc_4:* = this.readByte();
      _loc_1 = this.readByte();
на самом деле не читает 2 раза? (не писал на этом языке, потому сложности иногда с пониманием)

Вторая функция проще
ActionScript 3
1
2
3
public static function decodeZigZag32(param1:int) : int
{  return param1 >>> 1 ^ -(param1 & 1);
}
Помогите разобраться, кому не сложно
Заранее благодарен!

Добавлено через 8 минут
Да вот ссылочка кстати: protocol-buffers
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2013, 13:42
Ответы с готовыми решениями:

Перевод с as2 в as3
Здравствуйте! К сожалению, мои знания as оставляют желать лучшего). Написал код для вращения...

Перевод уроков на AS3
Доброго времени суток уважаемые программисты. Публикую деловое предложение. Есть достаточно...

Перевод кода кнопки с as3 на as2
Такая проблема : скачал исходник кнопки сделанную в AS 3.0, но проект я делаю в AS 2.0, когда...

Поиск пути: перевод кода с as1 в as3
всем доброго времени суток. Пытаюсь перевести код (представленный xitri.com) на actionscript 3.0....

Перевод с Delphi на actionscript: если целое число является степенью числа 3, то вывести TRUE
Надо перевести код на другой язык Delphi 7 ---&gt; на actionscript var i,N:integer; begin...

1
EDIsaev
4 / 4 / 2
Регистрация: 27.03.2012
Сообщений: 136
13.05.2013, 11:05  [ТС] 2
Спасибо, разобрался
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2013, 11:05

Спрайты в AS3
Я через объект Loader() загрузил картинку, и мне надо отобразить только часть картинки. как это...

duplicateMovieClip в AS3
AS2 никогда не изучал, но много примеров со спецефектами описаны именно на AS2 с приминением метода...

С AS1 на AS3
Всем доброго времени суток, очень приятно познакомиться. немного лирики о себе Когда-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru