Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Небольшой кусок кода JavaScript to Delphi / 12 сообщений из 12, страница 1 из 1
14.03.2018, 08:09
    #39614512
applauser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Небольшой кусок кода JavaScript to Delphi
Друзья, пожалуйста, помогите перевести несколько строк с JS на Delphi. С JS совсем не знаком, да и по Delphi хромаю, учусь.
Заранее спасибо откликнувшимся!
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
this.couple = function(d) {
    for (var a = [], b = [], e = function(a, b, c) {
            for (; a.length < c;) a = b + "" + a;
            return a
        }, c = 0; 2 > c; c++) a.push(Math.floor(65537 * Math.random()) + 0), b.push(e(parseInt(a[c]).toString(16), "0", 4));
    a.splice(1, 0, d);
    b.splice(1, 0, a.join(""));
    return b.join("")
};
...
Рейтинг: 0 / 0
14.03.2018, 10:32
    #39614585
Василий №2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Небольшой кусок кода JavaScript to Delphi
Кошмар какой... можно выдавить сишника из хаоса, но хаос из сишника - никогда. Даже если он перековался в жс-иста.
Для начала надо перегнать сие месиво в человеческий вид
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
this.couple = function(d) {
    var a = [], b = [];
    var e = function(a, b, c) {
            while (a.length < c)
                 a = b + "" + a;
            return a
        }
    var c = 0;
    for (; 2 > c; c++) {
        a.push(Math.floor(65537 * Math.random()) + 0);
        b.push(e(parseInt(a[c]).toString(16), "0", 4));
    }
    a.splice(1, 0, d);
    b.splice(1, 0, a.join(""));
    return b.join("")
};



Теперь функцию восстанавливаем из говнокода
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
this.couple = function(d) {
    var a = [], b = [];
    var padLeft = function(src, padChar, len) {
            while (src.length < len)
                 src = padChar + "" + src;
            return src
        }
    var c = 0;
    for (; 2 > c; c++) {
        a.push(Math.floor(65537 * Math.random()) + 0);
        b.push(padLeft(parseInt(a[c]).toString(16), "0", 4));
    }
    a.splice(1, 0, d);
    b.splice(1, 0, a.join(""));
    return b.join("")
};
...
Рейтинг: 0 / 0
14.03.2018, 10:53
    #39614597
Василий №2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Небольшой кусок кода JavaScript to Delphi
Переделываем идиотский цикл for (; 2 > c; c++)

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    function padLeft(src, padChar, len) {
            while (src.length < len)
                 src = padChar + "" + src;
            return src
        }

this.couple = function(d) {
    var a = [], b = [];
    var item;
    item = Math.floor(65537 * Math.random()) + 0;
    a.push(item);
    b.push(padLeft(item.toString(16), "0", 4));

    item = Math.floor(65537 * Math.random()) + 0;
    a.push(item);
    b.push(padLeft(item.toString(16), "0", 4));

    a.splice(1, 0, d);
    b.splice(1, 0, a.join(""));
    return b.join("")
};



Теперь видно, что splice тут как корове седло

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    function padLeft(src, padChar, len) {
            while (src.length < len)
                 src = padChar + "" + src;
            return src
        }

this.couple = function(d) {
    var a = [], b = [];
    var item;

    item = Math.floor(65537 * Math.random()) + 0;
    a.push(item);
    a.push(d);
    item = Math.floor(65537 * Math.random()) + 0;
    a.push(item);

    b.push(padLeft(parseInt(a[0]).toString(16), "0", 4));
    b.push(a.join(""));
    b.push(padLeft(parseInt(a[2]).toString(16), "0", 4));

    return b.join("")
};



Ну и финальный аккорд

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
    function padLeft(src, padChar, len) {
            while (src.length < len)
                 src = padChar + "" + src;
            return src
    }

    function fixedLenHex(src, len) {
            return padLeft(parseInt(src).toString(16), "0", len)
    }

this.couple = function(d) {
    var a = [
       Math.floor(65537 * Math.random()) + 0,
       d,
       Math.floor(65537 * Math.random()) + 0
    ];
    var b = [
       fixedLenHex(a[0], 4),
       a.join(""),
       fixedLenHex(a[2], 4)
    ];

    return b.join("")
};



Уф. Дальше сам. Говнокодокопательство жутко утомляет
...
Рейтинг: 0 / 0
14.03.2018, 11:14
    #39614615
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Небольшой кусок кода JavaScript to Delphi
Василий №2Уф. Дальше сам. Говнокодокопательство жутко утомляет
с учетом
applauserС JS совсем не знаком
недокопал
...
Рейтинг: 0 / 0
14.03.2018, 13:07
    #39614702
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Небольшой кусок кода JavaScript to Delphi
Кстати, а зачем нужны "" и 0 в конструкциях ниже?

Код: java
1.
2.
src = padChar + "" + src;
item = Math.floor(65537 * Math.random()) + 0;
...
Рейтинг: 0 / 0
14.03.2018, 13:13
    #39614707
applauser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Небольшой кусок кода JavaScript to Delphi
Василий №2,

Большое спасибо за рефакторинг. Теперь более-менее становится понятным. Этот код я получил, прогнав через Closure Compile еще более непонятный и длинный говнокод с бессмысленными чередами арифметических действий. Главное, чтоб return'ы относительно совпадали (random не в счет). Вы вывели несколько функций за пределы главной функции, их можно внутрь функции засовывать? Дело в том, что я пользуюсь онлайн отладчиками JS (например тут ). Несколько вариантов попробовал, не смог запустить код.
...
Рейтинг: 0 / 0
14.03.2018, 13:53
    #39614746
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Небольшой кусок кода JavaScript to Delphi
alekcvpКстати, а зачем нужны "" и 0 в конструкциях ниже?
в первом случае, наверное, для приведения к строке
во втором, хз, на выходе Math.floor уже number
...
Рейтинг: 0 / 0
14.03.2018, 15:05
    #39614798
Василий №2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Небольшой кусок кода JavaScript to Delphi
Докнедокопал
Дальше все на уровне логики и мануал по js в зубы)
alekcvpКстати, а зачем нужны "" и 0 в конструкциях ниже?

Код: java
1.
2.
src = padChar + "" + src;
item = Math.floor(65537 * Math.random()) + 0;


Издержки динамической типизации и корявости автора... Они не нужны при текущем применении ( 0 с Math.floor, "" с parseInt().toString() ). Кстати, если d - это число, то массив a можно генерить из заведомых чисел, соответственно parseInt тоже лишний.

applauserВы вывели несколько функций за пределы главной функции, их можно внутрь функции засовывать?
Можно конечно, это уже как удобнее будет.
...
Рейтинг: 0 / 0
14.03.2018, 15:11
    #39614801
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Небольшой кусок кода JavaScript to Delphi
Василий №2Издержки динамической типизации и корявости автораможет то намеренная обфускация
...
Рейтинг: 0 / 0
14.03.2018, 20:52
    #39615025
applauser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Небольшой кусок кода JavaScript to Delphi
Получилось вот так, вроде все работает:
Код: pascal
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.
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Single;
  a, b, s, t: string;
begin
  i := 111211;  //главный входной параметр
  s := IntToStr(Math.Floor(65537 * Random)); // в uses Math прописать
  t := IntToStr(Math.Floor(65537 * Random));
  a := s + FloatToStr(i) + t;
  b := fixedLenHex(StrToInt(s), 4) + md5(a) + fixedLenHex(StrToInt(t), 4);  //в uses IdHashMessageDigest для md5
  Memo1.Text := b;
end;

function padLeft(src, padChar: string; len: Integer): string;
begin
  while Length(src) < len do
    src := padChar + src;
  Result := src;
end;

function fixedLenHex(src, len: Integer): string;
begin
  Result := padLeft(fromDec(src, 16), '0', len);  //в JS есть простая функция .toString(16), а тут не очень простая
end;

function FromDec(n, r: longint): string;  //перевод из 10 в 16 систему счисления
var
  s: string;
const
  digit: string[16] = '0123456789abcdef';
begin
  s := '';
  repeat
    s := digit[(n mod r) + 1] + s;
    n := n div r;
  until n = 0;
  result := AnsiLowerCase(s);
end;

function md5(s: string): string;
begin
  Result := '';
  with TIdHashMessageDigest5.Create do
    try
      Result := AnsiLowerCase(HashStringAsHex(s));
    finally
      Free;
    end;
end;

ParseInt реально лишняя. Советы по оптимизации приветствуются )
Спасибо Василию за потраченное время!
...
Рейтинг: 0 / 0
14.03.2018, 21:29
    #39615047
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Небольшой кусок кода JavaScript to Delphi
applauserСоветы по оптимизации приветствуются )
1. Убери последнюю строку в FromDec - она бессмысленна.
2. Добавь const в параметр фции md5.
...
Рейтинг: 0 / 0
14.03.2018, 21:39
    #39615053
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Небольшой кусок кода JavaScript to Delphi
applauser
Код: pascal
1.
2.
3.
4.
5.
6.
function padLeft(src, padChar: string; len: Integer): string;
begin
  while Length(src) < len do
    src := padChar + src;
  Result := src;
end;


Я бы так сделал:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function padLeft( const src: String; padChar: Char; len: Integer): string;
var
  nCurLen: Integer;
begin
  Result := src;
  nCurLen := Length( src );
  if nCurLen < Len then
    Result := StringOfChar( padChar, Len - nCurLen ) + Result;
end;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Небольшой кусок кода JavaScript to Delphi / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]