URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9611
[ Назад ]

Исходное сообщение
"bc. Проблема перевода чисел из 16 в 2 систему счисления"

Отправлено guseniza , 24-Дек-12 18:27 
По snmp с коммутатора получаю данные о том, в какой vlan какие порты вкл untag либо  access.
по каждому vlan получаю 16-ое число типа: FFFFBF00
Необходимо для скрипта перевести его в двоичный вид.
Все очень просто:
bin=`echo "ibase=16; obase=2; $hex" | bc`
на выходе имеем 32 битное число:  
11111111111111111011111100000000

Но если 16-ричное число имеет вид: 00004000, то уже возникает проблема.
Получаю не 32 бита, а 100000000000000. т.е. все нули до "1" "съедаются". но для того, чтобы посчитать номер порта необходимо иметь все 32 бита.

как можно избежать этого?
может нужно добавлять нули до количества 32?
или использовать таблицу перевода чисел, а потом просто побитово конкатенировать?:))
Последний вариант стремный:)


Содержание

Сообщения в этом обсуждении
"bc. Проблема перевода чисел из 16 в 2 систему счисления"
Отправлено pavlinux , 24-Дек-12 18:49 
> чтобы посчитать номер порта необходимо иметь все 32 бита.

Гон

> как можно избежать этого?
> может нужно добавлять нули до количества 32?

bin=$(printf "%032d\n" `echo "ibase=16; obase=2; $hex" | bc`);


"bc. Проблема перевода чисел из 16 в 2 систему счисления"
Отправлено guseniza , 24-Дек-12 19:12 
>> чтобы посчитать номер порта необходимо иметь все 32 бита.
> Гон
>> как можно избежать этого?
>> может нужно добавлять нули до количества 32?
> bin=$(printf "%032d\n" `echo "ibase=16; obase=2; $hex" | bc`);

Извините, конечно, но не гон. подсчет идет с первого элемента. По простому,  каким он будет по счету - вот вам  и номер порта. Если вы видите в другом свете - проясните:)
Ваш пример работает, спасибо:)
но он не универсален:
работает только для подобного варианта 00002000.


уже сделал. Наиболее простой вариант в цикле добавлять в начало строки необходимое количество "0".


"bc. Проблема перевода чисел из 16 в 2 систему счисления"
Отправлено pavlinux , 25-Дек-12 00:59 
>>> чтобы посчитать номер порта необходимо иметь все 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


"bc. Проблема перевода чисел из 16 в 2 систему счисления"
Отправлено Andrey Mitrofanov , 15-Янв-13 09:49 
> $ 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


"bc. Проблема перевода чисел из 16 в 2 систему счисления"
Отправлено Bill1389 , 14-Янв-13 21:46 
А скриптиком не поделишься?Очень интересна реализация такого.

"bc. Проблема перевода чисел из 16 в 2 систему счисления"
Отправлено guseniza , 17-Янв-13 16:26 
$binport получает строку типа: FFFFFD00

          binports=`echo "ibase=16; obase=2; $hexports" | bc`

          len=${#binports}    
            if [ "$len" -ne "32" ]; then
            a=32    
            let "b=$a - $len"    # вычисляем количество нулей недостающих до 32

            for  (( n=1; $n <= $b; n=$(($n+1)))); do # добавляем нули в начало строки
            binports='0'${binports}
            done
            fi

Скрипт далеко не красавец, но если не нравится - переделайте. выложите сюда - прекрасно:)


"bc. Проблема перевода чисел из 16 в 2 систему счисления"
Отправлено Аноним , 17-Янв-13 23:15 
> Скрипт далеко не красавец, но если не нравится - переделайте.

Скрип просто урод :(
Лекарство: man printf


"bc. Проблема перевода чисел из 16 в 2 систему счисления"
Отправлено Maxim , 02-Июл-14 13:00 
>> Скрипт далеко не красавец, но если не нравится - переделайте.
> Скрип просто урод :(
> Лекарство: man printf

Покажите пожалуйста альтернативу этого скрипта, только не урод :)


"bc. Проблема перевода чисел из 16 в 2 систему счисления"
Отправлено pavlinux , 05-Июл-14 15:54 
>>> Скрипт далеко не красавец, но если не нравится - переделайте.
>> Скрип просто урод :(
>> Лекарство: man printf
> Покажите пожалуйста альтернативу этого скрипта, только не урод :)

"Лекарство: man printf"

printf "%032b\n"  $(echo "ibase=16; obase=2; FFFFFD00" | bc)


"bc. Проблема перевода чисел из 16 в 2 систему счисления"
Отправлено Ingoa , 08-Сен-14 17:55 
>>>> Скрипт далеко не красавец, но если не нравится - переделайте.
>>> Скрип просто урод :(
>>> Лекарство: man printf
>> Покажите пожалуйста альтернативу этого скрипта, только не урод :)
> "Лекарство: man printf"
> printf "%032b\n"  $(echo "ibase=16; obase=2; FFFFFD00" | bc)

              ~~

printf "%032d\n"  $(echo "ibase=16; obase=2; FFFFFD00" | bc)


"bc. Проблема перевода чисел из 16 в 2 систему счисления"
Отправлено pavlinux , 09-Сен-14 02:03 
>> printf "032b\n"  $(echo "ibase=16; obase=2; FFFFFD00" | bc)
>              ~~
> printf "032d\n"  $(echo "ibase=16; obase=2; FFFFFD00" | bc)

Тема не смотреть, заголовок не читать, сразу писать?