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.
Parte 2: 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:
(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:
Agora vem a parte divertida: fazendo a mesma coisa com o meu nome (estou usando agora fonte FIXA para dar uma ideia de tabela).
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:
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
dc -e "277201296679637797555446024759571638996\
1897351494372004891382757660685954618851613731\
6491080169418169379422635741235529987913384792\
0069570025933844008821898437588589611533P";\
# FIM. Copie ate aqui