eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › popaprany JS
Ilość wypowiedzi w tym wątku: 8

  • 1. Data: 2017-03-27 19:02:03
    Temat: popaprany JS
    Od: Roman Tyczka <n...@b...no>


    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ś :-)

    --
    pozdrawiam
    Roman Tyczka


  • 2. Data: 2017-03-27 20:42:41
    Temat: Re: popaprany JS
    Od: bartekltg <b...@g...com>

    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



  • 3. Data: 2017-03-27 22:39:07
    Temat: Re: popaprany JS
    Od: Andyy <n...@s...tego>

    W dniu 27.03.2017 o 20:42, bartekltg pisze:
    > if ("+"== s.charAt(n))

    Ja preferuję styl
    if (s.charAt(n) == "+")

    podobnie "x jest większy od 5", "x równa się 5" a nie "5 mniejsze od x",
    "5 równa się x"


  • 4. Data: 2017-03-27 22:52:19
    Temat: Re: popaprany JS
    Od: bartekltg <b...@g...com>

    On 27.03.2017 22:39, Andyy wrote:
    > W dniu 27.03.2017 o 20:42, bartekltg pisze:
    >> if ("+"== s.charAt(n))
    >
    > Ja preferuję styl
    > if (s.charAt(n) == "+")

    Ja też:)


    > podobnie "x jest większy od 5", "x równa się 5" a nie "5 mniejsze od x",
    > "5 równa się x"

    Wertsja odwrotna jest mniej czytelna, ale automatycznie wyłapuje
    zamianę == na =.
    W C czy c++ ma to jakiś sens. Dlaczego użył tego w JS, gdzie
    można by sie spodziewać pomyłki pomiędzy === a == ("słabsze"
    porównanie), której to ta zamiana nie wychwyci, cięzko powiedzieć ;-)

    pzdr
    bartekltg






  • 5. Data: 2017-03-28 01:33:53
    Temat: Re: popaprany JS
    Od: bartekltg <b...@g...com>

    On 27.03.2017 20:42, bartekltg wrote:

    > 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.


    Wyciagnę samą sztuczkę, bo piękna ;-)

    r=0;
    for (n = 0, a = s.length; n < a; n += 1)
    "+" === s[n] ? o += i.[n] : "*" === s[n] && o += e[r++];


    pzdr
    bartekltg


  • 6. Data: 2017-03-28 09:58:30
    Temat: Re: popaprany JS
    Od: Roman Tyczka <n...@b...no>

    On Mon, 27 Mar 2017 20:42:41 +0200, bartekltg wrote:

    >> 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
    >> }

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

    Być może to wynik pracy jakiegoś obfuscatora, udany wynik jak widać.

    > "+" === 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 :)
    >
    > 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).
    >
    > 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):

    Jeśli jest cymś innym? Czy raczej jeśli jest * właśnie?

    [...]

    > 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++) );

    ~= oznacza różny?
    Jeśli tak to warunek byłby dziwny:
    jeśli n-ty znak jest + to zrób to,
    w przeciwnym wypadku, jeśli n-ty znak jest różny od * (czyli znów równy +)
    to zrób tamto.

    I chyba literówka, nie a.charAt(n) tylko s.charAt(n).

    > A, drobna uwaga, nie znam JS ;-)

    Tak czy owak wielkie dzięki za pochylenie się nad tym ścierwem, dużo mi
    pomogłeś :-)

    --
    pozdrawiam
    Roman Tyczka


  • 7. Data: 2017-03-28 12:04:08
    Temat: Re: popaprany JS
    Od: bartekltg <b...@g...com>

    On 28.03.2017 09:58, Roman Tyczka wrote:
    >> "*" === 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):
    > Jeśli jest cymś innym? Czy raczej jeśli jest * właśnie?

    Rzeczywisćei, odwrotnie.
    Jak jest czym inym, to iloczyn musi być fałszywy
    i nie odpala drugiego nawiasu.



    > [...]
    >
    >> 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++) );
    > ~= oznacza różny?

    !=


    pzdr
    bartekltg


  • 8. Data: 2017-03-28 16:56:39
    Temat: Re: popaprany JS
    Od: Roman Tyczka <n...@b...no>

    On Tue, 28 Mar 2017 12:04:08 +0200, bartekltg wrote:

    >>> "*" === 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):
    >> Jeśli jest cymś innym? Czy raczej jeśli jest * właśnie?
    >
    > Rzeczywisćei, odwrotnie.
    > Jak jest czym inym, to iloczyn musi być fałszywy
    > i nie odpala drugiego nawiasu.

    No właśnie, a ma odpalać.

    >> [...]
    >>
    >>> 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++) );
    >> ~= oznacza różny?
    >
    > !=

    I to jest błąd, powinno być = :-)

    W każdym razie przebrnąłem i poszło, dzięki za wsparcie!


    --
    pozdrawiam
    Roman Tyczka

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: