Postagem em destaque

Criando bot do Telegram em Shell script com ShellBot

Conversão de bases

Clique na imagem para ampliar.

A conversão de base é importante quando precisamos informar notações numéricas menores em nosso código afim facilitar a compreensão e leitura do mesmo. Constantemente necessitamos realizar essas conversões e o uso da calculadora para este caso, pode transformar em uma tarefa extremamente enfadonha; Mas não fique desanimado, pois o Shell Script contém inúmeras ferramentas que irão lhe auxiliar de forma simples e fácil.

bash

Utilizando um recurso nativo do bash (building), através do operador $((...)) com a seguinte sintaxe:

$((base#numero))

Parâmetro Descrição
base Representação da qual os números são derivados.
numero Valor quantitativo da simbologia da base.

Representações da base:

Base Descrição Simbologia
2 Binário 01100001
8 Octal 0141
10 Decimal 97
16 Hexadecimal 61

O operador converte somente as bases acima para a sua simbologia de base decimal, não havendo suporte a conversões entre si ou vice-versa. Ou seja, só podemos converte a base para sua representação em decimal.

Convertendo binário para decimal.
$ echo $((2#01100001))
97
Foi retornado o valor 97 que é o número de derivação de base 2 do valor simbólico 01100001 em binário.

Convertendo hexadecimal para decimal.
$ echo $((16#ff))
255
Note que neste caso especifico não é informado a expressão 0x que precede uma notação hexadecimal que neste caso seria: 0xff. Pois ao informar a base 16 o operador interpreta que o valor informado posteriormente a expressão é um número hexadecimal.

printf

O comando printf do bash é uma variação do printf da linguagem C, porém mantém suas principais características de formato e impressão de argumentos a partir de uma formatação preestabelecida. A grosso modo podemos dizer que é uma alternativa ao comando echo, que imprime informações na tela, porém com muito mais recursos e é através dos seus argumentos de formato que iremos realizar a conversão de base.

$ printf [-v var] formato [argumentos]

Utiliza-se os caracteres de formato para especificar o tipo de valor para o qual os argumentos serão convertidos.

Formato Descrição
%x Converte argumento para a base hexadecimal.
%o Converte argumento para a base octal.
%d Converte argumento para a base decimal.
%u Converte argumento para a base decimal sem sinal.

Convertendo decimal para base octal.
$ printf '%o\n' 97
141

Convertendo decimal para hexadecimal
$ printf '%x\n' 255
ff

Ao contrário do operador do bash utilizado anteriormente, com o printf é possível realizar a conversão entre as bases sem nenhum problema. Para adicionar o prefixo de simbologia da base, basta inserir o caractere # (hashtag) antes do caractere de formato.

Convertendo decimal para hexadecimal, inserindo o prefixo de simbologia.
$ printf '%#x\n' 255
0xff

Convertendo hexadecimal para octal, inserindo o prefixo de simbologia.
$ printf '%#o\n' 0x61
0141

bc
 
É uma linguagem que suporta números de precisão arbitrária com inter-execução ativa de declarações. Sua sintaxe possui uma semelhança com a linguagem C. Sua biblioteca de matemática padrão está disponível por linha de comando, suportando diversas expressões matemáticas, inclusive a conversão de base; Que que por meio do echo iremos redirecionar nossa expressão para o '|' PIPE.


Parâmetros Descrição
ibase=<base> Especifica a base de entrada.
obase=<base> Especifica a base de saída.
valor Valor a ser convertido.

Sintaxe:

$ echo 'obase=<base>; ibase=<base>; valor' | bc

Cada parâmetro declarado é separado pelo delimitador ';' indicando o fim da linha de comando.

Convertendo o valor 70 de base decimal para binário.

$ echo 'obase=2; ibase=10; 70' | bc 
1000110

Convertendo o valor binário para decimal.

$ echo 'obase=10; ibase=2; 101011' | bc 
43

Para realizar as conversões especifique a notação de base em ibase e o seu respectivo valor simbólico. Fique atento na ordem como os parâmetros obase e ibase são declarados, evitando assim surpresas no resultado da expressão; Por padrão o bc lê os valores de base 10, exceto quando utilizamos o ibase.

Ficou claro como o bash oferece excelentes ferramentas e  que infelizmente não é possível mencionar todas aqui, porém não deixe de ver uma forma criativa de conversão de base binária para decimal utilizando array indexado. Para visualizar o postagem clique aqui.

Comentários

Contato

Nome

E-mail *

Mensagem *