Was ist die richtige Art, eine Binärdatei unter CentOS 7 mit Base64 zu kodieren?

Was ist die richtige Art, eine Binärdatei unter CentOS 7 mit Base64 zu kodieren?

Ich verwende CentOS 7 mit Bash-Shell. Ich dachte, die Base64-Kodierung einer Binärdatei wäre so einfach wie

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

Wenn ich mir jedoch die Dateilänge anschaue, stelle ich fest, dass sie kein Vielfaches von vier ist.

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

Ich weiß nicht, ob das, was ich getan habe, gültig ist oder nicht, aber wenn ich versuche, die Datei mit einer JS-Bibliothek zu dekodieren, erhalte ich eine Fehlermeldung, die darauf hinweist, dass die Zeichenfolgenlänge kein Vielfaches von vier ist. Daher frage ich mich, ob das, was ich oben getan habe, richtig ist oder ob es eine andere Möglichkeit gibt, dies zu tun.

Antwort1

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

Beachten Sie den nachstehenden Zeilenumbruch in der Ausgabe von base64; hier handelt es sich um das neunte Zeichen.

Bei längeren Eingaben werden mehr als eine Zeile erzeugt, da die Ausgabe standardmäßig alle 76 Zeichen umgebrochen wird. Sie können den Umbruch (einschließlich der letzten neuen Zeile) mit deaktivieren base64 -w0oder indem Sie die Ausgabe durchleiten tr -d '\n'.

Antwort2

base64schreibt mehrere Zeilen für mittellange Zeichenfolgen, daher müssen Sie die richtige Anzahl von Zeilenumbrüchen von der Dateigröße abziehen. Auf einigen Systemen kann das Dienstprogramm eine DOS-Textdatei schreiben (nicht mit base64GNU Coreutils, sondern mit der Implementierung vonAbonnierenauf BSD-Systemen üblich), in diesem Fall müssen Sie 2 Bytes pro Zeile abziehen, um die Länge der codierten Zeichenfolge zu erhalten.


Antwort auf die Frage in den Kommentaren: „Wie erhalte ich die reine Base64-Zeichenfolge ohne neue Links oder anderen Müll? Nur die Base64-Zeichenfolge?“

base64fügt nach jedem 76. Zeichen einen Zeilenumbruch ein, da 76 Zeichen die maximale Länge einer MIME-codierten Textzeile sind (und Base 64 am häufigsten zum Erstellen von Base 64 Content-Transfer-Encoding für E-Mails verwendet wird).

Wenn Sie diese Zeilenumbrüche entfernen möchten:

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

Mit base64GNU Coreutils können Sie

base64 -w0 filename >outfilename

Antwort3

Laut Handbuch:

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.

Es hört sich an, als ob das, was Sie tun, richtig ist, aber ich würde statt einer nutzlosen Verwendung von catetwas wie vorschlagen base64 file > file.b64.

verwandte Informationen