Conversor numérico
Publicado por Joanes Pereira Duarte (última atualização em 20/05/2013)
[ Hits: 9.243 ]
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
POSTFIX AUTOMÁTICO COM MYSQL E IPTABLES - ENVIA MSG CASO O USUÁRIO PASSE 90% DA SUA QUOTA
Script de controle do Alfresco para RHEL / CentOS / Fedora
Filtrando processos facilmente com psaux ( ps aux + grep + wc -l)
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como impedir exclusão de arquivos por outros usuários no (Linux)
Cirurgia no Linux Mint em HD Externo via USB
Anúncio do meu script de Pós-Instalação do Ubuntu
Formas seguras de instalar Debian Sid (2)
Duas Pasta Pessoal Aparecendo no Ubuntu 24.04.3 LTS (12)
Alguém pode me indicar um designer freelancer? [RESOLVIDO] (5)
Alguém executou um rm e quase mata a Pixar! (3)
Por que passar nas disciplinas da faculdade é ruim e ser reprovado é b... (6)









