Страница 1 из 2

Работа с данным типа id (internal ID)

Добавлено: 28 июл 2021, 13:03
Lurker
Добрый день.
Хотел сделать
log find where .id>$i а оно не работает
log find where .id=$i а вот так работает
set $i ($i+1) если $i типа id тоже не работает.
Вопрос: как можно получить все логи с .id больше n?

Re: Работа с данным типа id (internal ID)

Добавлено: 28 июл 2021, 13:13
xvo
id и num - разные типы данных.
Предполагаю, что надо использовать :tonum
Ну и обратно :toid

Re: Работа с данным типа id (internal ID)

Добавлено: 28 июл 2021, 13:16
Lurker
Предполагаю, что надо использовать :tonum
не работает. данные пропадают, получается тип nil
[@MikroTik] > global test *0
[@MikroTik] > put [typeof $test]
id
[@MikroTik] > set $test [tonum $test]
[@MikroTik] > put [typeof $test]
nil

Re: Работа с данным типа id (internal ID)

Добавлено: 28 июл 2021, 13:19
xvo

Re: Работа с данным типа id (internal ID)

Добавлено: 28 июл 2021, 13:32
Lurker
xvo писал(а): 28 июл 2021, 13:19 https://forum.mikrotik.com/viewtopic.php?t=86090
Не понял а что тут полезно для моего случая? там обсуждают работу с неизменными .id, а мне как раз менять надо.
либо получить выражиние >.id либо .id=.nextid
и да, в документации я нашёл .nextid, но воспользоваться не смог.

Re: Работа с данным типа id (internal ID)

Добавлено: 28 июл 2021, 13:50
xvo
Там алгоритм перевода id в num: отрезать звездочку, перевести hex в dec.

Re: Работа с данным типа id (internal ID)

Добавлено: 28 июл 2021, 14:08
Lurker
Я не нашёл там алгоритма. Там предложение отрезать звездочку и самому написать алгоритм перевода hex в num.
Самому алгоритм перевода писать трудновато.

Re: Работа с данным типа id (internal ID)

Добавлено: 28 июл 2021, 14:55
xvo
Ну так это и есть алгоритм.

Перевод hex в dec намного более общая задача и наверняка где-то можно найти готовую реализацию.

Re: Работа с данным типа id (internal ID)

Добавлено: 28 июл 2021, 22:03
podarok66
D = (an × pn-1) + (an-1 × pn-2) + (an-2 × pn-3) +…,
Где,
D – это число в десятичной форме, которое мы ищем;
n – количество символов в двоичном числе;
a – число в двоичной форме на n-й позиции (т.е. первый символ, второй, и т.п.);
p – коэффициент, равный 2,8 или 16 в степени n (в зависимости от системы счисления)

Вот алгоритм.... А вот как это алгоритм реализовать на Микротике, я затрудняюсь ответить. Всё это не настолько востребовано, чтобы легко искалось и было бы давно облизано. Слишком специфичная задачка. Я, во всяком случае, не встречал подобного для Микротика.

Re: Работа с данным типа id (internal ID)

Добавлено: 29 июл 2021, 00:32
xvo
Отсюда, в виде функции: https://github.com/eworm-de/routeros-sc ... -functions

Код: Выделить всё

# convert from hex (string) to num
:set HexToNum do={
  :local Input [ :tostr $1 ];
  :local Hex "0123456789abcdef0123456789ABCDEF";
  :local Multi 1;
  :local Return 0;

  :for I from=([ :len $Input ] - 1) to=0 do={
    :set Return ($Return + (([ :find $Hex [ :pick $Input $I ] ] % 16) * $Multi));
    :set Multi ($Multi * 16);
  }

  :return $Return;
}
И если я все правильно понял, IDшник можно скармливать как есть - все, что не попадает в символы Hex (в данном случае *) оно просто проигнорирует.