По snmp с коммутатора получаю данные о том, в какой vlan какие порты вкл untag либо access.
по каждому vlan получаю 16-ое число типа: FFFFBF00
Необходимо для скрипта перевести его в двоичный вид.
Все очень просто:
bin=`echo "ibase=16; obase=2; $hex" | bc`
на выходе имеем 32 битное число:
11111111111111111011111100000000Но если 16-ричное число имеет вид: 00004000, то уже возникает проблема.
Получаю не 32 бита, а 100000000000000. т.е. все нули до "1" "съедаются". но для того, чтобы посчитать номер порта необходимо иметь все 32 бита.как можно избежать этого?
может нужно добавлять нули до количества 32?
или использовать таблицу перевода чисел, а потом просто побитово конкатенировать?:))
Последний вариант стремный:)
> чтобы посчитать номер порта необходимо иметь все 32 бита.Гон
> как можно избежать этого?
> может нужно добавлять нули до количества 32?bin=$(printf "%032d\n" `echo "ibase=16; obase=2; $hex" | bc`);
>> чтобы посчитать номер порта необходимо иметь все 32 бита.
> Гон
>> как можно избежать этого?
>> может нужно добавлять нули до количества 32?
> bin=$(printf "%032d\n" `echo "ibase=16; obase=2; $hex" | bc`);Извините, конечно, но не гон. подсчет идет с первого элемента. По простому, каким он будет по счету - вот вам и номер порта. Если вы видите в другом свете - проясните:)
Ваш пример работает, спасибо:)
но он не универсален:
работает только для подобного варианта 00002000.
уже сделал. Наиболее простой вариант в цикле добавлять в начало строки необходимое количество "0".
>>> чтобы посчитать номер порта необходимо иметь все 32 бита.
> Ваш пример работает, спасибо:)
> но он не универсален:
> работает только для подобного варианта 00002000.Это ни у меня не работает, это у вас не работает;
$ hex=fff0fff0
$ echo "ibase=16; obase=2; $hex" | bc;
0
$ hex=0fff0fff0
$ echo "ibase=16; obase=2; $hex" | bc;
(standard_in) 1: syntax error
> $ hex=fff0fff0
> 0
> $ hex=0fff0fff0
> (standard_in) 1: syntax error:)))
man bc: ""(Note: They must be capitals. Lower case letters are variable names.)#!/bin/bash
echo "obase=2; $((16#$hex))" | bc
А скриптиком не поделишься?Очень интересна реализация такого.
$binport получает строку типа: FFFFFD00binports=`echo "ibase=16; obase=2; $hexports" | bc`
len=${#binports}
if [ "$len" -ne "32" ]; then
a=32
let "b=$a - $len" # вычисляем количество нулей недостающих до 32for (( n=1; $n <= $b; n=$(($n+1)))); do # добавляем нули в начало строки
binports='0'${binports}
done
fiСкрипт далеко не красавец, но если не нравится - переделайте. выложите сюда - прекрасно:)
> Скрипт далеко не красавец, но если не нравится - переделайте.Скрип просто урод :(
Лекарство: man printf
>> Скрипт далеко не красавец, но если не нравится - переделайте.
> Скрип просто урод :(
> Лекарство: man printfПокажите пожалуйста альтернативу этого скрипта, только не урод :)
>>> Скрипт далеко не красавец, но если не нравится - переделайте.
>> Скрип просто урод :(
>> Лекарство: man printf
> Покажите пожалуйста альтернативу этого скрипта, только не урод :)"Лекарство: man printf"
printf "%032b\n" $(echo "ibase=16; obase=2; FFFFFD00" | bc)
>>>> Скрипт далеко не красавец, но если не нравится - переделайте.
>>> Скрип просто урод :(
>>> Лекарство: man printf
>> Покажите пожалуйста альтернативу этого скрипта, только не урод :)
> "Лекарство: man printf"
> printf "%032b\n" $(echo "ibase=16; obase=2; FFFFFD00" | bc)~~
printf "%032d\n" $(echo "ibase=16; obase=2; FFFFFD00" | bc)
>> printf "032b\n" $(echo "ibase=16; obase=2; FFFFFD00" | bc)
> ~~
> printf "032d\n" $(echo "ibase=16; obase=2; FFFFFD00" | bc)Тема не смотреть, заголовок не читать, сразу писать?