Qual é o caminho certo para codificar com base64 um arquivo binário no CentOS 7?

0

Estou usando o CentOS 7 com o shell bash. Eu pensei que a codificação base64 de um arquivo binário seria tão simples quanto

[rails@server lib]$ cat mybinary.file | base64 > /tmp/output.base64

No entanto, percebo quando olho para o tamanho 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

Eu não sei se o que eu fiz é válido ou não, mas quando tento decodificar o arquivo com uma biblioteca JS, recebo um erro reclamando sobre o fato de que o tamanho da string não é um múltiplo de quatro, então Eu estou querendo saber se o que eu fiz acima está correto ou se há alguma outra maneira de fazê-lo.

    
por Dave 31.05.2018 / 22:17

3 respostas

2
$ echo foo |base64 
Zm9vCg==
$ echo foo |base64 |wc -c
9

Observe a nova linha à direita na saída de base64 , é o nono caractere aqui.

Para uma entrada mais longa, ele produzirá mais de uma linha, já que ela envolve a saída a cada 76 caracteres por padrão. Você pode desabilitar o agrupamento (incluindo a nova linha final) com base64 -w0 , ou canalizando a saída através de tr -d '\n' .

    
por 31.05.2018 / 22:34
1

base64 grava várias linhas para cadeias de caracteres moderadamente longas; portanto, você deve deduzir o número correto de novas linhas a partir do tamanho do arquivo. Em alguns sistemas, o utilitário pode escrever um arquivo de texto do DOS (não com base64 do GNU coreutils, mas com a implementação do fourmilab comum em sistemas BSD), caso em que você terá que deduzir 2 bytes por linha para obter o comprimento da string codificada.

Respondendo a uma pergunta nos comentários: "Como obtenho a string raw base64 sem nenhum ônus novo ou outro lixo? Apenas a string base64?"

base64 insere quebras de linha após cada 76º caractere, 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 a base 64    Content-Transfer-Encoding para e-mails).

Se você deseja remover essas quebras de linha:

base64 filename | tr -d '\n\r' >outfilename

Com base64 do GNU coreutils, você pode usar

base64 -w0 filename >outfilename
    
por 31.05.2018 / 22:43
0

Pelo 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 , sugiro algo como base64 file > file.b64 .

    
por 31.05.2018 / 22:25