A mágica do dc

"dc -e 2570P4510238961697475595691055458315856448013P2570P". Execute a linha acima no seu terminal bash. Agora creio que desejas saber como este número estranho gerou esta string, certo? Este é o propósito deste artigo.

[ Hits: 80.838 ]

Por: Elgio Schlemer em 11/01/2011 | Blog: https://profelgio.duckdns.org/~elgio


Introdução



O dc, para quem não conhece, é uma calculadora de notação polonesa.

Como qualquer aluno de programação sabe, pois certamente já teve que implementar algo em Linguagem de Programação ou Estrutura de Dados, a notação polonesa funciona sobre uma pilha.

Se para somar 200 com 500 se faz no bc (outra calculadora):

echo "200 + 300" | bc

No dc é um pouco diferente:

echo "200 300 + p" | dc

Onde se lê:
  • Empilha o 200
  • Empilha o 300
  • Operador + precisa de dois parâmetros. Desempilha dois parâmetros e soma (200 e 300)
  • Empilha o resultado da operação (500)
  • Imprime (sem desempilhar) o valor do topo da pilha (comano 'p'). No caso 500

Um exemplo mais completo para ilustrar de vez o conceito:

echo "200 3 4 5 6 7 + * - + + p" | dc
  • "200 3 4 5 6 7" são todos EMPILHADOS. A pilha está com o 7 sendo o TOPO
  • Operador de +, desempilha o 7 e o 6 e soma: 7+6 = 13. Empilha o 13. A pilha está agora com "200 3 4 5 13"
  • Operador de *, desempilha o 13 e o 5 e multiplica: 13*5 = 65. Empilha. A pilha agora está com "200 3 4 65"
  • Operador de -, desempilha o 65 e o 4 e faz 4-65= -61. Empilha. A pilha está agora com "200 3 -61"
  • Operador de +, desempilha o 3 e o -61 e soma: 3+ (-61) = -58. Empilha. A Pilha está agora com "200 -58"
  • Operador de +, desempilha o 200 e o -58 e soma: 200 + (-58) = 142. Empilha. A pilha está agora com "142"
  • Operador p, imprime o valor do topo. Imprime 142

O mais importante neste caso, o comando 'p', minúsculo, apenas imprime o que está no topo da pilha. Apenas um valor, não importa quantos estão na pilha.

Já o comando P (maiúsculo) faz uma impressão diferente. Ele imprime interpretando ASCII.

Veja:

echo "65 p" | dc # irá imprimir 65
echo "65 P" | dc # irá imprimir a letra A

O dc é um interpretador de comandos. Se você apenas digitar "dc" ele irá aguardar comandos. Por isto que se usa o echo junto com o pipe para evitar que ele aguarde que você digite algo.

Ou então pode-se usar o parâmetro -e, passando o que se quer digitar como parâmetro:

dc -e "65p"
$ dc -e "65P"


O último dc, se você está me acompanhando e reproduziu em seu terminal, imprimiu um A perdido, quase não notado antes do prompt.

Seria interessante ter uma quebra de linha, certo?

No mundo Unix a quebra de linha é reproduzida apenas com o caractere LF (Line Feed) que na tabela ASCII corresponde ao valor 10.

No mundo DOS uma quebra de linha precisa de LF+CR (Line Feed + Enter) que na tabela ASCCI é 10 e 13. Para quem não entendeu, isto explica porque o teu código em bash feito no Linux não abre corretamente no (sic) notepad. Isto é tão comum que já existem nas distribuições aplicativos como dos2unix e unix2dos apenas para converter de e para o formato de texto DOS.

Então para termos a nossa quebra de linha:

dc -e "65 P 10 P"

Meu nome neste formato:

dc -e "69P 108P 103P 105P 111P 32P 83P 99P 104P 108P 101P 109P 101P 114P 10P"

Deixei espaço em branco para facilitar, mas ele não é necessário:

dc -e "69P108P103P105P111P32P83P99P104P108P101P109P101P114P10P"

Isto já é um pouco nerd, mas ainda não tem graça. Tem muito 'P' aí e quem conhece ASCII logo iria sacar: "69 => 'E'

    Próxima página

Páginas do artigo
   1. Introdução
   2. O fantástico comando P do dc
   3. Conclusão
Outros artigos deste autor

Sinais em Linux

Criptografia chave simétrica de bloco e de fluxo

Introdução a criptografia

Estrutura do IPTables 2: a tabela nat

Fundamentos da criptografia assimétrica

Leitura recomendada

Exibindo um splash durante o boot com Splashy

Explorando o NFS do mrluk

SSH - Tradução da man page

Impressora JPG no Linux compartilhada para Windows

Easter Eggs em Linux

  
Comentários
[1] Comentário enviado por removido em 11/01/2011 - 22:12h

Fascinante!!!

[2] Comentário enviado por removido em 11/01/2011 - 22:19h

O mestre Elgio, como sempre, esbanjando competência num artigo simplesmente arrebatador.

10 !!!
;-))

[3] Comentário enviado por removido em 12/01/2011 - 01:27h

Excelentes palavras acv. Grande elgio. Muito bom mesmo.

10zão !

Abraço

[4] Comentário enviado por Teixeira em 12/01/2011 - 10:21h

A sua intimidade com o assunto é fascinante, e isso faz com que algo que em outras condições seria "chato" desperte o nosso interesse.
Didática excelente. Parabéns!

[5] Comentário enviado por alan-souza em 12/01/2011 - 10:57h

Impressionante!

Ideal para se utilizar no envio de mensagens!

=)

[6] Comentário enviado por anonymous em 12/01/2011 - 13:41h

A didática e conteúdo do artigo estão excelentes.
PARABÉNS!!!

[7] Comentário enviado por julio_hoffimann em 12/01/2011 - 20:28h

Prof. Elgio,

É um prazer ler seus artigos. Lembro quando cheguei no VOL e me deparei com aqueles de criptografia. Me cadastrei no site só para lhe dar os parabéns, foi assim que tudo começou.

Fico feliz que ainda esteja por aqui para nos ensinar coisas interessantes.

Abraço!

[8] Comentário enviado por caio em 13/01/2011 - 22:39h

Genial, gostei do artigo. Parabens

[9] Comentário enviado por dastyler em 14/01/2011 - 10:17h

Simples e útil. Elgio do it again!!



dc - an arbitrary precision calculator

:-P



[10] Comentário enviado por albfneto em 14/01/2011 - 19:50h

legal, 10!
Nosso amigo Elgio mostrando seu fantástico conhecimento de teoria linux!

[11] Comentário enviado por lptonussi em 17/01/2011 - 18:20h

massa

[12] Comentário enviado por removido em 17/01/2011 - 19:38h

muito interessante.

[13] Comentário enviado por Daemonio em 17/01/2011 - 21:31h

Muito legal Élgio.
Já procurei material sobre o dc e tudo que achei foi aquela man page densa e um pouco ruim de entender pra quem é iniciante. Seu artigo está ótimo. Parabéns!!

t+

[14] Comentário enviado por zippy em 18/01/2011 - 20:01h

Legal, bem interessante..

[15] Comentário enviado por premoli em 20/01/2011 - 14:29h

*_*
Viva o linux!!!

[16] Comentário enviado por eduardoweiland em 31/01/2011 - 16:34h

Abracadabra! É feita a mágica do dc...
Muito bom mesmo...


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts