Seltsam \ n in Base64-codierter Zeichenfolge in Ruby


159

Die eingebaute Base64-Bibliothek in Ruby fügt einige '\ n' hinzu. Ich kann den Grund nicht herausfinden. Für dieses spezielle Beispiel:

irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'base64'
=> true
irb(main):003:0> str =  "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054"
=> "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054"
irb(main):004:0> Base64.encode64(str)
=> "MTExMC0tYWQ2Y2EwYjA2ZTFmYmViN2U2NTE4YTA0MThhNzNhNmUwNGE2NzA1\nNA==\n"

Die \ n befinden sich an der letzten und sechsten Position vom Ende. Der Decoder (Base64.decode64) gibt den alten String perfekt zurück. Seltsamerweise fügen diese \ n der codierten Zeichenfolge keinen Wert hinzu. Wenn ich die Zeilenumbrüche aus der Ausgabezeichenfolge entferne, decodiert der Decoder sie erneut perfekt.

irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str
=> true

Darüber hinaus habe ich eine andere JS-Bibliothek verwendet, um die base64-codierte Ausgabe derselben Eingabezeichenfolge zu erstellen. Die Ausgabe erfolgt ohne die \ n.

Ist das ein Fehler oder etwas anderes? Hat sich schon jemand mit diesem Problem befasst?

Zu Ihrer Information,

$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]

das gleiche seltsame Problem hier
Nadav B

Antworten:


223

Bearbeiten: Seit ich geschrieben habe, wurde diese Antwort Base64.strict_encode64()hinzugefügt, die keine Zeilenumbrüche hinzufügt.


Die Dokumente sind etwas verwirrend, die b64encodeMethode soll für jedes 60. Zeichen eine neue Zeile hinzufügen, und das Beispiel für die encode64Methode verwendet tatsächlich die b64encodeMethode.

Es scheint, dass die pack("m")Methode für die Array-Klasse, die von verwendet wird, encode64auch die Zeilenumbrüche hinzufügt. Ich würde es als Designfehler betrachten, dass dies nicht optional ist.

Sie können die Zeilenumbrüche entweder selbst entfernen, oder wenn Sie Schienen verwenden, gibt es ActiveSupport :: CoreExtensions :: Base64 :: Encoding mit der encode64sMethode.


44
Scheint, dass es seit ich diese Antwort geschrieben habe, eine gibt, strict_encode64()die angeblich keine Zeilenumbrüche hinzufügt.
Christoffer Hammarström

15
So dumm! Warum tust du mir das an, Ruby?
Josh M.

1
Dies ist eine Assinie-Standardeinstellung, aber wie @ ChristofferHammarström erwähnt, gibt es jetzt eine Möglichkeit, eine echte b64-Codierung zu erhalten.
Dan

1
Anscheinend existiert dies, um die Abwärtskompatibilität mit Software aufrechtzuerhalten, die keine langen Schlangen verarbeiten kann. stackoverflow.com/a/20065991/5749914
Warlike Schimpanse

115

In Ruby-1.9.2 haben Sie Base64.strict_encode64, das das \ n (Zeilenumbruch) am Ende nicht hinzufügt.


Das ist eine viel einfachere Lösung!
Avishai

Ich habe überprüft, ob Base64.strict_encode64 nicht richtig codiert ist. wie Base64.strict_encode64 ('abc') -> YWJj. Das obige Beispiel ist nicht richtig codiert.
CodeMaker

9

Ja, das ist ganz normal. Das Dokument zeigt anhand eines Beispiels die Zeilenaufteilung. base64 macht dasselbe auch in anderen Sprachen (zB Python).

Der Grund, warum in der Codierungsphase inhaltsfreie Zeilenumbrüche hinzugefügt werden, liegt darin, dass base64 ursprünglich als Codierungsmechanismus für das Senden von binären Inhalten in E-Mails entwickelt wurde, bei denen die Zeilenlänge begrenzt ist. Sie können sie jederzeit ersetzen, wenn Sie sie nicht benötigen.


1
Dies geschah gerade in meiner Android App (Javas Base64-Bibliothek). Ich war total verwirrt mit diesem seltsamen Ereignis. Ich habe buchstäblich 1 Stunde gebraucht, um herauszufinden, was los ist, und dann nach dem Fehler gesucht. Dieser Kommentar hilft, ältere Probleme auch nach 6 Jahren zu verstehen.
Einbrecher

5

Scheint, als müssten sie ausgezogen / ignoriert werden, wie:

Base64.encode64(str).gsub(/\n/, '')

Diese Lösung ist schmutzig .. sonst noch?
Arnold Roa

1
@yaauie ( über empfohlene Bearbeitung ): Änderungen, die eine wesentliche Änderung bewirken, sollten im Allgemeinen nicht durchgeführt werden. Ich würde empfehlen, dies als separate Antwort zu veröffentlichen.
Pokechu22


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.