Qual é a maneira correta de codificar em base64 um arquivo binário no CentOS 7?

Qual é a maneira correta de codificar em base64 um arquivo binário no CentOS 7?

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 -w0ou canalizando a saída por meio de tr -d '\n'.

Responder2

base64grava 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 base64o 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?"

base64insere 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 base64o 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.

informação relacionada