Como posso verificar o valor Base64 para um inteiro?

2

Gostaria de verificar o valor de Base64 para um número inteiro. Existe um comando base64 linux mas não entendo como posso aplicá-lo em inteiros.

Eu tentei com base64 10 , mas recebi a mensagem de erro base64: 10: No such file or directory

Eu acho que o problema pode ser que Base64 é usado para Binary para conversão Textual, então não faz sentido passar um argumento Textual para ele. Portanto, meu argumento 10 é lido como uma string textual e não como um número binário. Existe alguma maneira de transformar um argumento textual em um binário?

Como posso usar o comando base64 para obter o valor Base64 para um inteiro?

    
por Jonas 24.10.2010 / 16:39

2 respostas

4

Converta o número em hexadecimal do que use echo para imprimir a sequência de bytes correspondente e canalize isso para base64 . Então, para codificar o inteiro 10 com base64, você pode usar:

echo -en '\xA' | base64

Para explicar o resultado. O byte 10 tem a seguinte representação binária:

00001010

O que o base64 faz é agrupá-los em grupos de 6 bits. Então, com padding, obtemos os seguintes 6lets:

000010 100000

Que em decimal são 2 e 32, que correspondem às letras C e g.

    
por 24.10.2010 / 17:38
0

O comando abaixo converte um inteiro decimal para a base 64. Ele não usa o esquema de codificação Base64, mas usa os caracteres usados pela variante segura para URL do esquema de codificação Base64 como dígitos.

awk 'NR==FNR{a[NR-1]=$0;next}{if($0==0){print"A";next}o="";for(n=$0;n!=0;n=int(n/64))o=a[n%64]o;print o}' <(printf %s\n {A..Z} {a..z} {0..9} - _) -

O comando abaixo faz o mesmo no Bash. Ele também funciona com o Zsh se você substituir l%64 por l%64+1 .

unset a;a=({A..Z} {a..z} {0..9} - _);while IFS= read l;do if ((l==0));then echo A;continue;fi;o=;for ((;l!=0;l/=64));do o=${a[l%64]}$o;done;printf %s\n "$o";done

Isso converte o radix 64 em decimal:

awk 'NR==FNR{a[$0]=NR-1;next}{o=0;for(i=NF;i>=1;i--)o+=a[$i]*64^(NF-i);print o}' FS= <(printf %s\n {A..Z} {a..z} {0..9} - _) -

Isso faz o mesmo no Bash:

unset a;i=0;declare -A a;for x in {A..Z} {a..z} {0..9} - _;do a[$x]=$((i++));done;while IFS= read l;do o=0;for((i=${#l};i>=1;i--));do let o+=${a[${l:i-1:1}]}*64**(${#l}-i);done;echo "$o";done

Os comandos awk resultam em perda de precisão com 2**53+1 e números maiores, mas para evitá-lo você pode adicionar -M ( --bignum ) em gawk 4.1 e posterior.

Os comandos Bash resultam em estouro de inteiro com 2**63 e números maiores.

    
por 09.07.2016 / 12:20