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: 79.494 ]

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


O fantástico comando P do dc



A grande vantagem o comando P é que ele pode pegar um inteiro qualquer e ler como uma string!

Vamos com um exemplo pequeno: o 'A' seguido de quebra de linha:

dc -e "65P10P"

Se a gente pensar no 65 na memória (UM BYTE) e o 10 na memória (UM BYTE), porém pegar estes DOIS bytes juntos e ver qual inteiro dá, o que teríamos?

O caminho mais prático para isto é transformar em HEXA:
  • 65 => 0x41
  • 10 => 0x0A

(usei a notação 0x por ser a notação do C)

Então teríamos 0x410A como a junção da letra 'A' (65) com um LF (10).

Qualquer calculadora me diz que 0x410A = 16650 em decimal.

Então:
  • dc -e "16650P"

Agora vem a parte divertida: fazendo a mesma coisa com o meu nome (estou usando agora fonte FIXA para dar uma ideia de tabela).

STRING => 'E' 'l' 'g' 'i' 'o' ' ' 'S' 'c' 'h' 'l' 'e' 'm' 'e' 'r' LF
DECIMAL=> 69  108 103 105 111  32  83  99 104 108 101 109 101 114 10
HEXA   => 45   6C  67  69  6F  20  53  63  68  6C  65  6D  65  72 0A

Agora temos que pegar este enorme número em HEXA (456C67696F205363686C656D65720A) e ver qual é o inteiro que ele representa.

Tem várias maneiras de fazer isto. Irei sugerir o bc que é muito versátil na conversão de bases:

echo -ne "ibase=16\n456C67696F205363686C656D65720A\n"|bc

(indico que a entrada, ibase, é na 16)

Isto me dá o simpático número 360467176607105907189923076131615242.

Então:

dc -e "360467176607105907189923076131615242P"

A medida que a string aumenta em caracteres, o número inteiro atinge proporções ALARMANTES.

Para evitar problemas com os cortes, linhas muito longas, pode-se usar o contra barra. No bash, assim como no C, a contra barra indica que a linha ainda não acabou, continuando na linha de baixo.

dc -e "277201296679637797555446024759571638996\
1897351494372004891382757660685954618851613731\
6491080169418169379422635741235529987913384792\
0069570025933844008821898437588589611533P"


Você pode, agora, simplesmente copiar o trecho acima e colar no seu terminal. Nem precisa colocar em um arquivo. Só dê um ENTER final para enviar o comando.

Como o # é comentário, isto também é aceito:

# INICIO. Copie a partir daqui
dc -e "277201296679637797555446024759571638996\
1897351494372004891382757660685954618851613731\
6491080169418169379422635741235529987913384792\
0069570025933844008821898437588589611533P";\
# FIM. Copie ate aqui

Página anterior     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

Programação com números inteiros gigantes

Parâmetros interessantes do scanf e do printf em C

Guerra Infinita, uma análise da Ciência da Computação

Estrutura do Iptables

Criptografia chave simétrica de bloco e de fluxo

Leitura recomendada

Instalando o VMWare no Slackware

Impressione seus amigos mudando as músicas no seu computador pelo celular

Linux, a pirataria de software e a desvalorização do desenvolvedor (parte 2)

Instalando Debian direto do HD

Os Codinomes do Ubuntu

  
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
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts