Conversor numérico
Publicado por Joanes Pereira Duarte (última atualização em 20/05/2013)
[ Hits: 8.920 ]
Olá pessoal.
Este script faz a conversão de números entre binários, decimais, octais e hexadecimais. Não utilizei nenhum tipo de calculadora, procurei fazer sem dependências, apenas com operadores, ER e controle de caracteres.
Funciona da seguinte forma:
$ ./convert.sh [formato de entrada] [número] [formato de saída]
Onde:
-b= binário
-o= octal
-d= decimal
-x= hexadecimal
Exemplos de uso:
Binário para hexadecimal:
$ ./convert.sh -b 1111101 -x
Ele vai retornar:
7D
Decimal para octal:
$ ./convert -d 467 -o
Retorna:
723
Espero que seja útil a alguém.
#!/bin/bash # convert.sh # # Script faz a conversão de formatos numérios entre as notações binário, # octal, decimal e hexadecimal. # # Conversor de formato numérico # Versão 1.0: Conversor de decimal para binário # Versão 1.1: Adicionado conversor binário para decimal # Versão 1.2: Adicionado conversor de decimal para hexadecimal # Versão 1.3: Adicionado conversor de hexadecimal para decimal # Versão 1.4: Adicionado conversor de decimal para octal # Versão 1.5: Adicionado conversor de octal para dicimal # Versão 1.4: Adicionado demais conversores usando como base as conversões # sobre a notação decimal # # Joanes Duarte, Maio 2013 # ########################[ FUNÇÕES DE INFORMAÇÃO ]######################### opcoes_de_uso() { echo -e "{FONTE}33[1mUso: $(basename "$0") [OPÇÕES]{FONTE}33[m" echo './convert.sh [formato de entrada] [número] [formato de saída]' echo echo -e "{FONTE}33[1mOPÇÕES{FONTE}33[m -b --binario Opção usada para converter número binário como formato de entrada ou para número binário como formato de saída. -o --octal Opção usada para converter número octal como formato de entrada ou para número octal como formato de saída. -d --decimal Opção usada para converter número decimal como formato de entrada ou para número decimal como formato de saída. -x --hexadecimal Opção usada para converter número octal como formato de entrada ou para número octal como formato de saída. -h, --help Mostra esta tela de ajuda do programa. -V, --version Mostra a versão do programa. " exit 1 } # Extrai versão diretamente do cabeçalho do programa versao() { echo -n $(basename "$0") grep '^# Versão ' "$0" | tail -1 | cut -d : -f 1 | tr -d \# exit 0 } #########################[ FUNÇÕES DE TESTE ] ############################## ### TESTE DECIMAL teste_decimal() { [[ "$ENTRADA" =~ ^[0-9]+$ ]] && decimal_par_3 \ || echo "Notação decimal inválida." } # TESTE BINÁRIO teste_binario() { [[ "$ENTRADA" =~ ^[0-1]+$ ]] && binario_par_3 \ || echo "Notação binária inválida." } # TESTE HEXADECIMAL teste_hexadecimal() { [[ "$ENTRADA" =~ ^[0-9a-fA-F]+$ ]] && hexadecimal_par_3 \ || echo "Notação hexadecimal inválida." } # TESTE OCTAL teste_octal() { [[ "$ENTRADA" =~ ^[0-8]+$ ]] && octal_par_3 \ || echo "Notação octal inválida." } ########################[ FUNÇÕES DE CONVERSÃO ]############################ ### DECIMAL PARA BINÁRIO decimal_binario() { while [ "$ENTRADA" -gt 1 ] do RESTO=$(($ENTRADA % 2)) # Armazena o valor do resto da divisão ENTRADA=$(($ENTRADA / 2)) # (1 ou 0) no arquivo de saída. echo -n $RESTO >> calc_temp.txt done RESTO=$(($ENTRADA % 2)) echo -n $RESTO >> calc_temp.txt BINARIO=$(cat calc_temp.txt | rev) ; rm calc_temp.txt } ### BINARIO PARA DECIMAL binario_decimal() { NUM_CARAC=$(echo ${#ENTRADA}) # Conta nº de caracteres da variavel EXPOENTE=0 DECIMAL=0 while [ "$NUM_CARAC" -gt 0 ] do (( NUM_CARAC -- )) CARACTERE=$(echo ${ENTRADA:${NUM_CARAC}:1}) # Do último para o primeiro MULT=$((2 ** $EXPOENTE * $CARACTERE)) # pega cada caractere, DECIMAL=$(($DECIMAL + $MULT)) # calcula o valor e soma # na variavel (( EXPOENTE ++ )) done } ### DECIMAL PARA HEXADECIMAL decimal_hexadecimal() { if [ "$ENTRADA" -lt 10 ] then HEXADECIMAL=$ENTRADA elif [ "$ENTRADA" -lt 16 ] then [[ "$ENTRADA" -eq 10 ]] && HEXADECIMAL=A [[ "$ENTRADA" -eq 11 ]] && HEXADECIMAL=B [[ "$ENTRADA" -eq 12 ]] && HEXADECIMAL=C [[ "$ENTRADA" -eq 13 ]] && HEXADECIMAL=D [[ "$ENTRADA" -eq 14 ]] && HEXADECIMAL=E [[ "$ENTRADA" -eq 15 ]] && HEXADECIMAL=F else while [ "$ENTRADA" -gt 1 ] do RESTO=$(($ENTRADA % 16)) ENTRADA=$(($ENTRADA / 16)) [[ "$RESTO" -eq 10 ]] && RESTO=A [[ "$RESTO" -eq 11 ]] && RESTO=B [[ "$RESTO" -eq 12 ]] && RESTO=C [[ "$RESTO" -eq 13 ]] && RESTO=D [[ "$RESTO" -eq 14 ]] && RESTO=E [[ "$RESTO" -eq 15 ]] && RESTO=F echo -n $RESTO >> calc_temp.txt done RESTO=$(($ENTRADA % 16)) [[ "$RESTO" -eq 10 ]] && RESTO=A [[ "$RESTO" -eq 11 ]] && RESTO=B [[ "$RESTO" -eq 12 ]] && RESTO=C [[ "$RESTO" -eq 13 ]] && RESTO=D [[ "$RESTO" -eq 14 ]] && RESTO=E [[ "$RESTO" -eq 15 ]] && RESTO=F echo -n $RESTO >> calc_temp.txt HEXADECIMAL=$(cat calc_temp.txt | rev | sed 's/^0//') ; rm calc_temp.txt fi } ### HEXADECIMAL PARA DECIMAL hexadecimal_decimal() { NUM_CARAC=$(echo ${#ENTRADA}) # Conta nº de caracteres da variavel EXPOENTE=0 DECIMAL=0 while [ "$NUM_CARAC" -gt 0 ] do (( NUM_CARAC -- )) CARACTERE=$(echo ${ENTRADA:${NUM_CARAC}:1}) [[ "$CARACTERE" = [Aa] ]] && CARACTERE=10 # Trecho faz a [[ "$CARACTERE" = [Bb] ]] && CARACTERE=11 # transformaçao [[ "$CARACTERE" = [Cc] ]] && CARACTERE=12 # da letra [[ "$CARACTERE" = [Dd] ]] && CARACTERE=13 # no número [[ "$CARACTERE" = [Ee] ]] && CARACTERE=14 # equivalente [[ "$CARACTERE" = [Ff] ]] && CARACTERE=15 MULT=$((16 ** $EXPOENTE * $CARACTERE)) DECIMAL=$(($DECIMAL + $MULT)) (( EXPOENTE ++ )) done } ### DECIMAL PARA OCTAL decimal_octal() { while [ "$ENTRADA" -gt 1 ] do RESTO=$(($ENTRADA % 8)) # Armazena o valor do resto da divisão ENTRADA=$(($ENTRADA / 8)) # (1 ou 0) no arquivo de saída. echo -n $RESTO >> calc_temp.txt done RESTO=$(($ENTRADA % 8)) echo -n $RESTO >> calc_temp.txt OCTAL=$(cat calc_temp.txt | rev | sed 's/^0//') ; rm calc_temp.txt } ### OCTAL PARA DECIMAL octal_decimal() { NUM_CARAC=$(echo ${#ENTRADA}) # Conta nº de caracteres da variavel EXPOENTE=0 DECIMAL=0 while [ "$NUM_CARAC" -gt 0 ] do (( NUM_CARAC -- )) CARACTERE=$(echo ${ENTRADA:${NUM_CARAC}:1}) # Do último para o primeiro MULT=$((8 ** $EXPOENTE * $CARACTERE)) # pega cada caractere, DECIMAL=$(($DECIMAL + $MULT)) # calcula o valor e soma na variavel (( EXPOENTE ++ )) done } ################[ Tratamento das opções de linha de comando ]################# ### DIRECIONAMENTO DO PARÂMETRO 3 decimal_par_3() { case "$SAIDA" in -b | --binario) decimal_binario ; echo -e "{FONTE}33[1m${BINARIO}{FONTE}33[m" ; exit 0 ;; -d | --decimal) echo -e "{FONTE}33[1m${ENTRADA}{FONTE}33[m" ; exit 0 ;; -x | --hexadecimal) decimal_hexadecimal ; echo -e "{FONTE}33[1m${HEXADECIMAL}{FONTE}33[m" ; exit 0 ;; -o | --octal) decimal_octal ; echo -e "{FONTE}33[1m${OCTAL}{FONTE}33[m" ; exit 0;; esac } binario_par_3() { case "$SAIDA" in -b | --binario) echo -e "{FONTE}33[1m${ENTRADA}{FONTE}33[m"; exit 0 ;; -d | --decimal) binario_decimal ; echo -e "{FONTE}33[1m${DECIMAL}{FONTE}33[m" ; exit 0 ;; -x | --hexadecimal) binario_decimal ; ENTRADA="$DECIMAL" ; decimal_hexadecimal ; echo -e "{FONTE}33[1m${HEXADECIMAL}{FONTE}33[m" exit 0 ;; -o | --octal) binario_decimal ; ENTRADA="$DECIMAL" ; decimal_octal ; echo -e "{FONTE}33[1m${OCTAL}{FONTE}33[m" ; exit 0 ;; esac } hexadecimal_par_3() { case "$SAIDA" in -b | --binario) hexadecimal_decimal ; ENTRADA="$DECIMAL" ; decimal_binario ; echo -e "{FONTE}33[1m${BINARIO}{FONTE}33[m" ; exit 0 ;; -d | --decimal) hexadecimal_decimal ; echo -e "{FONTE}33[1m${DECIMAL}{FONTE}33[m" ; exit 0 ;; -x | --hexadecimal) echo -e "{FONTE}33[1m${ENTRADA}{FONTE}33[m" ; exit 0 ;; -o | --octal) hexadecimal_decimal ; ENTRADA="$DECIMAL" ; decimal_octal ; echo -e "{FONTE}33[1m${OCTAL}{FONTE}33[m" ; exit 0 ;; esac } octal_par_3() { case "$SAIDA" in -b | --binario) octal_decimal ; ENTRADA="$DECIMAL" ; decimal_binario ; echo -e "{FONTE}33[1m${BINARIO}{FONTE}33[m" ; exit 0 ;; -d | --decimal) octal_decimal ; echo -e "{FONTE}33[1m${DECIMAL}{FONTE}33[m" ; exit 0 ;; -x | --hexadecimal) octal_decimal ; ENTRADA=$DECIMAL ; decimal_hexadecimal ; echo -e "{FONTE}33[1m${HEXADECIMAL}{FONTE}33[m" ; exit 0 ;; -o | --octal) echo -e "{FONTE}33[1m${ENTRADA}{FONTE}33[m"; exit 0 ;; esac } ### DIRECIONAMENTO DO PARÂMETRO 1 # Aceita 3 parâmetros ou -V, --version, -h e --help como único parâmetro [[ "$1" =~ -(h|V)|--(version|help) ]] || [ "$#" -eq '3' ] || { opcoes_de_uso ; } # Passado teste inicial define variaveis $1 e $2 e testa o parâmetro $1 ENTRADA=$2 SAIDA=$3 case "$1" in -b | --binario) teste_binario ;; -d | --decimal) teste_decimal ;; -x | --hexadecimal) teste_hexadecimal ;; -o | --octal) teste_octal ;; -h | --help) opcoes_de_uso ;; -V | --version) versao ;; * ) opcoes_de_uso ;; esac
PDC Samba + LDAP no Debian Lenny
Backup do banco de dados Postgresql
Limitador de conexões para usuários
NFS server/client com iptables
Firewall para Compartilhamento de Conexão 3G
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Título: Descobrindo o IP externo da VPN no Linux
Armazenando a senha de sua carteira Bitcoin de forma segura no Linux
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Instalando Brave Browser no Linux Mint 22
vídeo pra quem quer saber como funciona Proteção de Memória:
Encontre seus arquivos facilmente com o Drill
Mouse Logitech MX Ergo Advanced Wireless Trackball no Linux
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
O que esta havendo com o mercado de ti? (9)
Não consigo cadastrar nenhuma conta online (5)
Hotspot Mikrotik nao carrega pagina de login. (0)