Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > pl.comp.programming > #29524

Re: popaprany JS

From bartekltg <bartekltg@gmail.com>
Newsgroups pl.comp.programming
Subject Re: popaprany JS
Date 2017-03-27 20:42 +0200
Organization ATMAN - ATM S.A.
Message-ID <obbmf2$5ps$1@node1.news.atman.pl> (permalink)
References <j6xj1vxv7su9$.dlg@tyczka.com>

Show all headers | View raw


On 27.03.2017 19:02, Roman Tyczka wrote:
>
> Próbuję przekonwertować kawałek kodu z JS na delphi, ale poziom zakręcenia
> mnie przerósł, proszę o pomoc w wyjaśnieniu ludzkim językiem co tu się
> dzieje:
>
>
> function(e, s, i)
> {
>  var n, a, o = "",
>  l = t.isArray(e),
>  r = 0;
>  for (n = 0, a = s.length; n < a; n += 1) "+" === s.charAt(n) ? o +=
> i.charAt(n) : "*" === s.charAt(n) && (o += l ? e[r++].value :
> e.charAt(r++));
>  return o
> }
>
> Jako, że JS ma typowanie między pośladkami to typy wejściowe odgaduje z
> szerszego kontekstu, którego tu nie umieszczam by nie mącić, jako:
>
> e - chyba tablica, w każdym razie wynik funkcji z jQuery
> this.ui.maskedInput.serializeArray()
>
> s - to string z maską złożoną ze znaków + i *
> //  "mask": "+++*+*+***++++++++++++++++++++++"
>
> i - to sól w łanćuchu tekstowym
> //  "salt": "rDUrqpBMmlNGJQgk87uKCUGMlK4dU51R",
>
>
> Całość to kawałek formularza logowania, a konkretnie wyliczania hasha z
> hasła.
>
> Proszę szczególnie o rozwikłanie tej pętli, czyli konkretnie tego:
>
> "+" === s.charAt(n) ? o += i.charAt(n) : "*" === s.charAt(n) && (o += l ?
> e[r++].value : e.charAt(r++));
>
> To koszmarek jakiś :-)

Jeśli to dobrze rozumiem, to genialny przykład "chackerstwa" (tak, ch;))



"+" === s.charAt(n) ? o += i.charAt(n)

Na razie prosto. Operator trójargumentowy ?: jak w c++.

Czy n-ta (kto normalny iteruje po n, czyję się zgorszony!:)
literaka s to "+"
(porównujemy ===, bo == jest miękkie :)
https://dorey.github.io/JavaScript-Equality-Table/ )

Jeśli tak, to dodajemy literkę na koniec o,
  o += i.charAt(n)
(nie wynika nic z tego, co jest po :)
jeśli nie, to (co innego, o tym poźniej).

Zawsze używałem ?: w formie
x = b?a:b;
a tu jety użyte po prostu jako if(b) a() : b();
Poza zmyleniem przeciwnika chyba nie ma nic w tym złego:)

Teraz zaczynają się schody, jeśli s[n] nie ejst plusem,
wykona się to:

"*" === s.charAt(n) && (o += l ? e[r++].value : e.charAt(r++))

Nieco rozszerzając:

"*" === s.charAt(n)
&&
(o += l ? e[r++].value : e.charAt(r++))

Sztuczka polega na tym, że to wyrażenie wylicza
się do boola. Jeśli s[n] to '*', zadziała
leniwa ewaluacja i nawias się nie wykona.
Jeśli jest czym innym niż *, mamy (strzelam dodatkowe
nawiasowanie):

o += ( l ? e[r++].value : e.charAt(r++))

l oznaczało  "e jest tablicą" (od typu 't'?).
tutaj wołaczamy wiec do o to, co ejst pod 'e'
na r-tym miejscu, tylko w zalezności od tego
jakiego typu jest e, różnie się to tej literki
dobieramy. Ot, takie bieda templejty ;-)

Nawet w JS nalezałoby tu raczej zrobić tego ifa
na poczatku lub jakoś inaczej opokować to wyciąganie.


Ostatecznie strzelałbym, że to znaczy(to nie JS:)

if ("+"== s.charAt(n))
	o += i.charAt(n);
else if ('*' ~= a.charAt(n) )
    o+ = (l ? e[r++].value : e.charAt(r++) );


A, drobna uwaga, nie znam JS ;-)


pzdr
bartekltg

Back to pl.comp.programming | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

popaprany JS Roman Tyczka <noemail@because.no> - 2017-03-27 19:02 +0200
  Re: popaprany JS bartekltg <bartekltg@gmail.com> - 2017-03-27 20:42 +0200
    Re: popaprany JS Andyy <nie@spamowac.tego> - 2017-03-27 22:39 +0200
      Re: popaprany JS bartekltg <bartekltg@gmail.com> - 2017-03-27 22:52 +0200
    Re: popaprany JS bartekltg <bartekltg@gmail.com> - 2017-03-28 01:33 +0200
    Re: popaprany JS Roman Tyczka <noemail@because.no> - 2017-03-28 09:58 +0200
      Re: popaprany JS bartekltg <bartekltg@gmail.com> - 2017-03-28 12:04 +0200
        Re: popaprany JS Roman Tyczka <noemail@because.no> - 2017-03-28 16:56 +0200

csiph-web