shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] hexadecimal / traffic control


From: Reinaldo Carvalho
Subject: Re: [shell-script] hexadecimal / traffic control
Date: Fri, 28 Jul 2006 21:55:42 -0300

Só para ficar registrado...

Formas práticas de conversão:

Hexadecimal => Decimal
$ echo $((16#0000f0050))
983120
$ echo $((0x0000f0050))
983120
$ echo $((16#00050))
80
$ echo $((0x00050))
80

Decimal => Hexadecimal
$ printf "%x\n" 80
50
$ echo 0080 | awk '{ printf "%x\n",$1 }'
50

Só achei essa forma de "Decimal => Hexadecimal" pouco flexivel...
$ printf "%x\n" 080
bash: printf: 080: invalid number
0
$ printf "%x\n" 0x00080
80


Operações com bitwise:

Todos as casas de digitos são consideradas:
$ echo $((0x7531 & 0xffff))
30001
$ echo $((0x7531))
30001

A primeira casa de digito é considerada:
$ echo $((0x7531 & 0xf000))
28672
$ echo $((0x7000 & 0xf000))
28672
$ echo $((0x7000))
28672

A primeira e segunda casas de digitos são consideradas:
$ echo $((0x7531 & 0xff00))
29952
$ echo $((0x7500))
29952

A primeira, segunda e terceira casas de digitos são consideradas:
$ echo $((0x7531 & 0xfff0))
30000
$ echo $((0x7530))
30000


TODO:
bitwise com | e ^
melhorar Decimal => Hexadecimal com printf


On 7/28/06, Felipe Kellermann <address@hidden> wrote:
On Fri, 28 Jul 2006 8:14pm  -0300, Reinaldo Carvalho wrote:

> Felipe,
>
> >   % echo $((0x8001 & 0xff00))
> >   32768
> >
> Não entendi como isso funciona.. pode dar mais exemplos?

Reinaldo,

Desculpas, pensei que o exemplo estava claro.  Eu estou fazendo uma
operação /and/ bitwise, como em C, C++, ou similares.  O resultado que eu
estou obtendo é em decimal.  As operações bitwise suportadas pelos shells
são &, ^, |, e shifts para esquerda ou direita.

Eu enviei uma outra mensagem para esta mesma thread que tem mais exemplos
sobre isto, talvez eles ajudem.  Fale se tiver mais alguma dúvida sobre a
aplicação dos operadores.  Observação:  A precedência deles é a mesma que
em C/C++.


> >   % echo $((16#8000))
> >   32768
> >
> Perfeito, com certeza a melhor maneira Hexa => Decimal
> Existe algo semelhante para Decimal => Hexa ?


Oh, sim.  Dependendo do shell. Em zsh há uma interface matemática simples
que faz o inverso de base#, que é [#base].  Por exemplo, invertendo o
exemplo anterior:

  % print $(([#16]32768))
  16#8000


Ou no formato C...

  % setopt C_BASES
  % print $(([#16]32768))
  0x8000


A opção em outros shells e zsh também, genérica, é usar printf builtin dos
shells (lembra-se que há o comando printf também).  Se tu estiveres usando
bash, podes usar a opção -v, como nos exemplos que seguem:

  $ printf "%x\n" 32768
  8000

Ou

  $ printf -v convertido "%x\n" 32768

Agora convertido tem o valor convertido.

  $ printf "Valor convertido: %d\n" $convertido
  Valor convertido: 8000


Recomendo o uso de zsh, que tem todo o suporte a conversões de bases tudo
buildin (base#, base##, [#base], [##base], etc).  Boa sorte com os teus
trabalhos com tc/iproute, este assunto é realmente interessante  ;-)


Bom final-de-semana,

--
Felipe Kellermann


---------------------------------------------------------------------
Esta lista não admite a abordagem de outras liguagens de programação, como 
perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio 
aviso.
---------------------------------------------------------------------
Sair da lista: address@hidden
---------------------------------------------------------------------
Esta lista é moderada de acordo com o previsto em 
http://www.listas-discussao.cjb.net
---------------------------------------------------------------------
Servidor Newsgroup da lista: news.gmane.org
Grupo: gmane.org.user-groups.programming.shell.brazil


Links do Yahoo! Grupos











--
Reinaldo Carvalho
Debian Sarge 3.1 - Linux User: #238310
Prodepa - address@hidden


reply via email to

[Prev in Thread] Current Thread [Next in Thread]