[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] usando dc
From: |
Viktor Mota |
Subject: |
Re: [shell-script] usando dc |
Date: |
Tue, 23 Jan 2007 17:54:22 -0200 |
Olá Miranda,
Em terça-feira, 23 de janeiro de 2007, 09:00:36, você escreveu:
>
Alguém tem um link de algum artigo
tratando do comando dc ? Principalmente
com aquelas mágicas que êle faz para tratamento
de strings .
Há tempos atraś alguém postou um script que gerava
a tripa a ser passada para o dc para ele gerar
uma determinada string . Se alguém puder postar de novo , seria
interessante
De antemão , agradeço a ajuda
Entra no site do Thobias e pega
http://thobias.org/bin/sig_dc
Segue copia do script
---
#!/bin/bash
# sig_dc: script que converte uma frase/palavra para valores
# magicos para o DC imprimir
#
# Autor: Thobias Salazar Trevisan
#
# Changelog:
# 14/02/2005 - somente bash, sed, od e dc. nao precisa mais bc e gawk
# 19/09/2002 - primeira versao
#
########################## Documentacao ##############################
#
# O dc eh uma calculadora (reverse-polish desk calculator) muito
# poderosa. Para saber mais detalhes: 'man dc' ou procure no google.
# Isto eh um script, nao um tutorial. 8=)
#
# Com a opcao P ele imprime um valor ascii como caractere, exemplo:
#
# prompt> echo 65P | dc
# A
#
# Ele faz isso fazendo um shift de 8 bits, ie, 256. Qualquer numero
# eh trato como uma colecao de 8 bits concatenados. Assim a partir
# de um numero decimal, ele vai shiftando por 256 e obtendo cada
# letra. Para ficar mais facil:
#
# Imagine que se queira escrever AB. Primeiro pega-se a
# representacao binaria da letra A: (A = decimal 65)
#
# prompt> echo "obase=2;65" | bc -l
# 1000001
#
# Como o DC pega a cada 8 bits, preenche-se com zero a esquerda
# ateh formar 8 bits. Ficando 01000001
# Depois, executa-se o mesmo procedimento para a letra B (decimal 66)
#
# prompt> echo "obase=2;66" | bc -l
# 1000010
#
# 8 bits = 01000010
#
# Agora concatena-se os dois valores binarios:
# 0100000101000010
#
# Transforma este valor em decimal, e assim, chega-se ao valor
# magico ;)
#
# prompt> echo "ibase=2;0100000101000010" | bc -l
# 167906
# prompt> echo 16706P | dc
# AB
#
# PS: o dc nao coloca newline no final. tem que fazer o mesmo esquema
# para adicionar o '\n'
#
# Chato de fazer a mao neh !? Entao:
# Let's Code
# ou
# echo 92357463970445465556903178P | dc
#
######################################################################
#
#################### Funcoes
#
# converte binario para decimal
bd(){
local n=$1 pw=1 t=0 i
for i in $(seq "$((${#n}-1))" -1 0);do
eval t="$(echo "${n:$i:1} $pw * $t + p" | dc)"
eval pw="$(echo "$pw 2 * p" | dc)"
done
echo $t
}
# converte de decimal para binario. binario de 8 'bits'
db(){
local d=$1 b
while [ "$d" -gt 0 ];do b="$(($d%2))$b"; d="$(($d/2))"; done
echo "${b:-0}" | sed ':a;s/^[01]\{1,7\}$/0&/;ta'
}
#################### Main
# testa parametro
[ "$1" ] || {
echo "Uso: $0 palavra/frase"
echo "Ex.: $0 Unix is cool"
exit 1; }
# testa se existe o comando dc
dc -V >&- 2>&- || {
echo "Erro: A calculadora DC não está instalada."
echo "Instale-a antes de executar o $0"
exit 1; }
SIZE="$@"
for i in $(seq 1 "${#SIZE}");do
char="${SIZE:((i-1)):1}"
decimal=$(echo -n "$char" | od -d | sed -n '1s/^[^ ]* *\([0-9]\+\).*/\1/p')
binary="$binary$(db $decimal)"
done; binary=${binary}00001010 # adiciona \n
echo "echo $(bd $binary)P | dc"
---
--
Sds,
Viktor Mota
address@hidden
[As partes desta mensagem que não continham texto foram removidas]