
Estou usando o CentOS 7 com shell bash. Achei que codificar em base64 um arquivo binário seria tão simples quanto
[rails@server lib]$ cat mybinary.file | base64 > /tmp/output.base64
No entanto, percebo que quando olho para o comprimento do arquivo, não é um múltiplo de quatro
[rails@server lib]$ ls -al /tmp/output.base64
-rw-rw-r-- 1 rails rails 92935 May 31 15:50 /tmp/output.base64
Não sei se o que fiz é válido ou não, mas quando tento decodificar o arquivo com uma biblioteca JS recebo um erro reclamando do fato de que o comprimento da string não é múltiplo de quatro, então estou me perguntando se o que fiz acima está correto ou se há alguma outra maneira de fazer isso.
Responder1
$ echo foo |base64
Zm9vCg==
$ echo foo |base64 |wc -c
9
Observe a nova linha final na saída de base64
, é o nono caractere aqui.
Para entradas mais longas, produzirá mais de uma linha, pois agrupa a saída a cada 76 caracteres por padrão. Você pode desativar o empacotamento (incluindo a nova linha final) com base64 -w0
ou canalizando a saída por meio de tr -d '\n'
.
Responder2
base64
grava várias linhas para strings moderadamente longas; portanto, você deve deduzir o número correto de novas linhas do tamanho do arquivo. Em alguns sistemas, o utilitário pode escrever um arquivo de texto DOS (não com base64
o GNU coreutils, mas com a implementação dofourmilabcomum em sistemas BSD), caso em que você terá que deduzir 2 bytes por linha para obter o comprimento da string codificada.
Respondendo à pergunta nos comentários: "Como faço para obter a string base64 bruta sem novas garantias ou outro lixo? Apenas a string base64?"
base64
insere quebras de linha após cada 76 caracteres, já que 76 caracteres é o comprimento máximo de uma linha de texto codificada em MIME (e a base 64 é mais comumente usada para criar codificação de transferência de conteúdo base 64 para e-mails).
Se você deseja remover essas quebras de linha:
base64 filename | tr -d '\n\r' >outfilename
Com base64
o GNU coreutils, você pode usar
base64 -w0 filename >outfilename
Responder3
De acordo com o manual:
SYNOPSIS base64 [OPTION]... [FILE] DESCRIPTION Base64 encode or decode FILE, or standard input, to standard output. With no FILE, or when FILE is -, read standard input.
Parece que o que você está fazendo está certo, mas, em vez de invocar um uso inútil de cat
, sugeriria algo como base64 file > file.b64
.