¿Cuál es la forma correcta de codificar en base64 un archivo binario en CentOS 7?

¿Cuál es la forma correcta de codificar en base64 un archivo binario en CentOS 7?

Estoy usando CentOS 7 con bash shell. Pensé que codificar en base64 un archivo binario sería tan simple como

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

Sin embargo, noto que cuando miro la longitud del archivo, no es múltiplo de cuatro.

[rails@server lib]$ ls -al /tmp/output.base64 
-rw-rw-r-- 1 rails rails 92935 May 31 15:50 /tmp/output.base64

No sé si lo que he hecho es válido o no, pero cuando intento decodificar el archivo con una biblioteca JS me sale un error quejándome del hecho de que la longitud de la cadena no es múltiplo de cuatro, así que estoy Me pregunto si lo que hice arriba es correcto o si hay alguna otra forma de hacerlo.

Respuesta1

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

Tenga en cuenta la nueva línea final en la salida de base64, aquí es el noveno carácter.

Para entradas más largas, producirá más de una línea, ya que ajusta la salida cada 76 caracteres de forma predeterminada. Puede desactivar el ajuste (incluida la nueva línea final) con base64 -w0o canalizando la salida a través de tr -d '\n'.

Respuesta2

base64escribe varias líneas para cadenas moderadamente largas, por lo que debe deducir la cantidad correcta de nuevas líneas del tamaño del archivo. En algunos sistemas, la utilidad puede escribir un archivo de texto DOS (no con base64GNU coreutils, sino con la implementación decuatromilabcomún en sistemas BSD), en cuyo caso tendrá que deducir 2 bytes por línea para obtener la longitud de la cadena codificada.


Respondiendo a la pregunta en los comentarios: "¿Cómo obtengo la cadena base64 sin procesar sin nuevos gravámenes u otra basura? ¿Solo la cadena base64?"

base64inserta saltos de línea después de cada 76.º carácter, ya que 76 caracteres es la longitud máxima de una línea de texto codificada con MIME (y la base 64 se usa más comúnmente para crear codificación de transferencia de contenido en base 64 para correos electrónicos).

Si desea eliminar estos saltos de línea:

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

Con base64GNU coreutils, puedes usar

base64 -w0 filename >outfilename

Respuesta3

Según el 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 lo que estás haciendo es correcto, pero en lugar de invocar un uso inútil de cat, sugeriría algo como base64 file > file.b64.

información relacionada