Warum enthält die base64 eines Strings "\ n"?

15834
Tiina
$ echo -n "apfjxkic-omyuobwd339805ak:60a06cd2ddfad610b9490d359d605407" | base64 YXBmanhraWMtb215dW9id2QzMzk4MDVhazo2MGEwNmNkMmRkZmFkNjEwYjk0OTBkMzU5ZDYwNTQw Nw== 

Die Ausgabe hat zuvor eine Rückkehr Nw==. Was ist der richtige Weg, um base64 in Linux zu generieren?

Terminal-Screenshot

60
Sind Sie sicher, dass die Ausgabe eine neue Zeile enthält, und es ist nicht nur Ihr Fensterumbruch? Dieser Befehl hat auf Mac gut funktioniert. Welches Betriebssystem verwendest du? Ian vor 7 Jahren 5
@lan können Sie das auch unter http://www.motobit.com/util/base64-decoder-encoder.asp sehen Tiina vor 7 Jahren 0
RFC 2045, in dem Base64 definiert wurde, ERFORDERT eine neue Zeile nach 76 Zeichen (max). Warum denken Sie, dass Ihr Beispiel _nicht_ der richtige Weg ist? MSalters vor 7 Jahren 45
@MSalters [RFC 4648] (https://tools.ietf.org/html/rfc4648) behebt dieses Problem speziell. * Implementierungen DÜRFEN KEINEN Zeilenvorschub zu Basis-codierten Daten hinzufügen, es sei denn, die Spezifikation, die sich auf dieses Dokument bezieht, weist Basis-Encoder explizit an, Zeilenvorschub nach einer bestimmten Anzahl von Zeichen hinzuzufügen. * => Diese Implementierung ist gemäß RFC 4648 falsch, sofern dies der Fall ist behauptet, "plain" base64-kodierte Ausgabe zu erzeugen. Interessanterweise bezieht sich die Manpage von GNU base64 (in Frage?) Speziell auf RFC 3548, der standardmäßig auch kein Wrapping angibt und welche RFC 4648 obsoletes ist. Bob vor 7 Jahren 22
@MSalters Weil ich der Meinung war, dass "Base 64-Codierung kein Leerzeichen / tab / \ n" enthält, und dies wird auch von "java.util.Base64" implementiert. Tiina vor 7 Jahren 0
@ Bob: RFCs haben etwas weniger Respekt vor der API-Stabilität. Ein base64-Tool kann nicht nur das Ausgabeformat ändern, ohne Skripts zu brechen. MSalters vor 7 Jahren 4
@MSalters Ich kann nicht sicher sein, dass eine ältere Version nicht existiert, aber GNU base64 wurde 2004 geschrieben und AFAICT hat immer behauptet, RFC 3548 zu folgen. RFC 3548 enthält die gleiche Klausel "MUSS NICHT Zeilenvorschub hinzufügen". So war auch die ursprüngliche Implementierung "falsch". Zumindest stimmt die Implementierung nicht mit der Dokumentation überein. Trotzdem haben Sie gefragt, warum das Beispiel von OP korrekt ist, und auf einen RFC verwiesen. Meine Antwort ist der korrekte RFC, der base64 tatsächlich isoliert definiert. Wenn Ihre Antwort "aus historischen Gründen" ist, so sei es, aber OP ist hier nicht falsch. Bob vor 7 Jahren 2
Es scheint ein Durcheinander zu sein: https://en.wikipedia.org/wiki/Base64#Implementations_and_history Grundsätzlich ist base64 mit sich selbst nicht kompatibel. Großartig. Oskar Skog vor 7 Jahren 2
Gibt es base64-Decodierungsimplementierungen, die nicht \ n `s in der Eingabe akzeptieren? (Ich hoffe nicht, aber wer weiß ...) marcelm vor 7 Jahren 0
@marcelm in java Wenn eine base64-Zeichenfolge `\ n` enthält, wirft der Decoder` java.lang.IllegalArgumentException: Unzulässiges base64-Zeichen a` Tiina vor 7 Jahren 2
btw, in Ihrem Beispiel ist der Zweck von base64 unklar, da die Eingabe bereits ein ASCII-Text ist, so dass base64 die Datengröße nur unnötig aufblähen würde. Sarge Borsch vor 7 Jahren 0
Obwohl das Beispiel möglicherweise ASCII war, kann man nicht davon ausgehen, dass der Inhalt, um den sich das OP handelt, immer ASCII ist. kayleeFrye_onDeck vor 7 Jahren 0

2 Antworten auf die Frage

119
Kamil Maciorowski

Versuchen:

echo -n "apfjxkic-omyuobwd339805ak:60a06cd2ddfad610b9490d359d605407" | base64 -w 0 

Von man base64:

-w, --wrap=COLS
Kodierte Zeilen nach COLSZeichen umbrechen (Standard 76). Verwenden Sie 0diese Option, um den Zeilenumbruch zu deaktivieren.

Oh Mann, ich habe das immer nur durch 'tr' geleitet. Gut zu wissen, dass es einen "richtigen Weg" gibt. Score_Under vor 7 Jahren 16
46
Score_Under

Dies ist der Antwort von Kamil auf Systemen, die die -wOption unterstützen base64, unterlegen. Wenn dies jedoch nicht möglich ist (z. B. Alpine Linux, ein Arch Linux- initramfsHook usw.), können Sie die Ausgabe von base64 manuell verarbeiten:

base64 some_file.txt | tr -d \\n 

Dies ist der Brute-Force-Ansatz. Anstatt das Programm zur Zusammenarbeit zu bringen, verwende ich trwahllos jeden Zeilenumbruch bei stdout.