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

Обсуждение ПО и его настройки
Lurker
Сообщения: 159
Зарегистрирован: 29 апр 2021, 10:45

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


xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

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


Telegram: @thexvo
Lurker
Сообщения: 159
Зарегистрирован: 29 апр 2021, 10:45

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


xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва



Telegram: @thexvo
Lurker
Сообщения: 159
Зарегистрирован: 29 апр 2021, 10:45

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


xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

Там алгоритм перевода id в num: отрезать звездочку, перевести hex в dec.


Telegram: @thexvo
Lurker
Сообщения: 159
Зарегистрирован: 29 апр 2021, 10:45

Я не нашёл там алгоритма. Там предложение отрезать звездочку и самому написать алгоритм перевода hex в num.
Самому алгоритм перевода писать трудновато.


xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

Ну так это и есть алгоритм.

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


Telegram: @thexvo
Аватара пользователя
podarok66
Модератор
Сообщения: 4360
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

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

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


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

Отсюда, в виде функции: 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 (в данном случае *) оно просто проигнорирует.


Telegram: @thexvo
Ответить