Сейчас на форуме: igorcauret, Rio (+6 невидимых)

 eXeL@B —› Вопросы новичков —› помогите обратить цикл
Посл.ответ Сообщение

Ранг: 57.0 (постоянный), 10thx
Активность: 0.050.08
Статус: Участник

Создано: 17 октября 2014 22:33
· Личное сообщение · #1

разбираю одну прогу. алгоритм разобрал и обратил полностью, за исключением одного предпоследного цикла

вот код переведенный из асма:
длинна полезных данных в массиве $11 последние 3 байта добавляются
Code:
  1. len:=$11;
  2. setlength(arr1,len+3);
  3. arr1[0]:=$A;
  4. arr1[1]:=$B;
  5. arr1[2]:=$C;
  6. arr1[3]:=$D;
  7. arr1[4]:=$E;
  8. arr1[5]:=$F;
  9. arr1[6]:=$10;
  10. arr1[7]:=$11;
  11. arr1[8]:=$1;
  12. arr1[9]:=$2;
  13. arr1[10]:=$3;
  14. arr1[11]:=$4;
  15. arr1[12]:=5;
  16. arr1[13]:=6;
  17. arr1[14]:=7;
  18. arr1[15]:=8;
  19. arr1[16]:=0;
  20. arr1[17]:=0;
  21. arr1[18]:=$6C;
  22. arr1[19]:=$6F;
  23.  
  24. i:=0;
  25. a:=0;
  26. b:=a;
  27. while i<len do
  28.   begin
  29.     arr1[a]:=(arr1[b] and $3F) shl 2;
  30.     inc(b);
  31.     arr1[a]:=arr1[a]+((arr1[b] and $30) shr 4);
  32.  
  33.     inc(a);
  34.     arr1[a]:=(arr1[b] and $0F) shl 4;
  35.     inc(b);
  36.     arr1[a]:=arr1[a] + ((arr1[b] and $3C) shr 2);
  37.  
  38.     inc(a);
  39.     arr1[a]:=(arr1[b] and $03) shl 6;
  40.     inc(b);
  41.     arr1[a]:=arr1[a] + (arr1[b] and $3F);
  42.  
  43.     inc(a);
  44.     inc(b);
  45.  
  46.     i:=i+4;
  47.   end;

на выходе получаем:
28 B3 0D 38 F4 11 04 20 C4 14 61 C8 00 0B 2F 08

не могу понять как обратить алгоритм. основная загвоздка как обратить and
что посоветуете?



Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 18 октября 2014 01:08 · Поправил: kunix
· Личное сообщение · #2

Это перетасовка бит при переводе из base64 в бинарь. Младшие 6 бит массива arr1 склеиваются, старшие 2 убираются.
Можете повторить это побитово, так будет проще.

| Сообщение посчитали полезным: zds

Ранг: 57.0 (постоянный), 10thx
Активность: 0.050.08
Статус: Участник

Создано: 18 октября 2014 01:50
· Личное сообщение · #3

kunix
спс, но уже сам допер. фишка была в том, что на входе байты не могли быть больше $3F
собственно обратно получается как то так
Code:
  1. a:=0;
  2. b:=0;
  3. c:=0;
  4. c1:=0;
  5. for I := 1 to 5 do
  6.   begin
  7.     a:=arr1[c] shr 2;
  8.     b:=arr1[c] - (shl 2);
  9.     arr2[c1]:=a;
  10.     inc(c);
  11.     inc(c1);
  12.  
  13.     a:=arr1[c] shr 4;
  14.     d:=shl 4 +a;
  15.     b:=arr1[c] - (shl 4);
  16.     arr2[c1]:=d;
  17.     inc(c);
  18.     inc(c1);
  19.  
  20.     a:=arr1[c] shr 6;
  21.     d:=shl 2 +a;
  22.     b:=arr1[c] - (shl 6);
  23.     arr2[c1]:=d;
  24.     inc(c);
  25.     inc(c1);
  26.  
  27.     arr2[c1]:=b;
  28.     inc(c1);
  29.  
  30.   end;

тему закрываю


 eXeL@B —› Вопросы новичков —› помогите обратить цикл
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати