Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > Общие вопросы Web
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2013, 13:47   #1
Isaev
Пользователь
 
Регистрация: 16.03.2007
Сообщений: 13
По умолчанию Перевод функции с AS3 на Delphi

Доброго времени суток!
Анализировал скрипты из одной флешки, там организовано общение с сервером по TCP с использованием библиотеки protocol-buffers она для для Java, C и Python, а вот для Delphi сколько не гуглил, не нашёл.
Там при работе с кодированными потоками в основном используется такая конструкция
PHP код:
override public function readInt() : int
{
   return 
decodeZigZag32(this.readRawVarint32());

Вот соответственно описания:
decodeZigZag32(int n)
readRawVarint32()
Проблема в следующем, в исходниках на java по ссылке выше, видем следующий код
PHP код:
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 05i++) {
              if (
readRawByte() >= 0) {
                return 
result;
              }
            }
            throw 
InvalidProtocolBufferException.malformedVarint();
          }
        }
      }
    }
    return 
result;
  } 
Читается побайтно, хотя в итоге для обычного int читается до 5 байт, вместо 4... плюс ещё до 5 может отбрасываться...
а в ActionScript она выглядит следующим образом:
PHP код:
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 раза больше байт? ПОЧЕМУ?
Или например
PHP код:
 var _loc_4:* = this.readByte();
      
_loc_1 this.readByte(); 
на самом деле не читает 2 раза? (не писал на этом языке, потому сложности иногда с пониманием)

Вторая функция проще
PHP код:
public static function decodeZigZag32(param1:int) : int
{  return param1 >>> ^ -(param1 1);

Помогите разобраться, кому не сложно
Заранее благодарен!
Isaev вне форума Ответить с цитированием
Старый 13.05.2013, 11:09   #2
Isaev
Пользователь
 
Регистрация: 16.03.2007
Сообщений: 13
По умолчанию

Спасибо, вопрос решён.
Isaev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия. Не удается перевод функции с VBA на Delphi Sharamoff Общие вопросы Delphi 4 16.01.2013 09:19
Перевод функции с JavaScript на .NET sawer5 C# (си шарп) 1 07.10.2012 11:18
доделать перевод функции из фортрана в VBA meigas Помощь студентам 0 29.05.2012 20:43
AS3 и jquery romazabelin JavaScript, Ajax 8 03.04.2012 12:40
Перевод функции на С++ [CODER] Помощь студентам 5 20.03.2010 14:01