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]
Antworten:
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
b64encode
Methode soll für jedes 60. Zeichen eine neue Zeile hinzufügen, und das Beispiel für dieencode64
Methode verwendet tatsächlich dieb64encode
Methode.Es scheint, dass die
pack("m")
Methode für die Array-Klasse, die von verwendet wird,encode64
auch 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
encode64s
Methode.quelle
strict_encode64()
die angeblich keine Zeilenumbrüche hinzufügt.In Ruby-1.9.2 haben Sie Base64.strict_encode64, das das \ n (Zeilenumbruch) am Ende nicht hinzufügt.
quelle
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.
quelle
Scheint, als müssten sie ausgezogen / ignoriert werden, wie:
quelle
Verwenden Sie die
strict_encode64
Methode.encode64
fügt \ n alle 60 Symbole hinzuquelle
Das
\n
bei der Verwendung hinzugefügteBase64#encode64
ist korrekt. Überprüfen Sie diesen Beitrag: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/quelle