Conversor numérico
Publicado por Joanes Pereira Duarte (última atualização em 20/05/2013)
[ Hits: 9.177 ]
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
Script para rodar software Mr Bayes em paralelo
Gera estatísticas de tráfego de pacotes nas interfaces de um servidor linux via SNMPv3.
Configuração do Mysql no Suse, quando ocorre o seguinte erro: "ERROR 2002: Can't connect to local My
Atualização automática do Slackware
slackpigs - veja os pacotes que mais ocupam espaço no Slackware
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Pergunta: Meu teclado não está respondendo direito como e consertar? (2)
Secure boot, artigo interessante, nada técnico. (6)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (0)









