2010-04-12 8 views
105

La bibliothèque intégrée Base64 de Ruby ajoute des \ n. Je suis incapable de trouver la raison. Pour cet exemple particulier:Strange n dans la chaîne encodée en base64 dans Ruby

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" 

Les \ n sont à la dernière et sixième position à partir de la fin. Le décodeur (Base64.decode64) renvoie parfaitement l'ancienne chaîne. Chose étrange, ces \ n n'ajoutent aucune valeur à la chaîne codée. Lorsque je supprime les nouvelles lignes de la chaîne de sortie, le décodeur le décode à nouveau parfaitement.

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

Plus de cela, j'ai utilisé une autre bibliothèque JS pour produire base64 sortie codée de la même chaîne d'entrée, la sortie est sans que le \ n.

Est-ce un bug ou autre chose? Est-ce que quelqu'un a déjà fait face à ce problème?

Pour votre information,

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

Répondre

135

Edit: Depuis que j'ai écrit cette réponse Base64.strict_encode64() a été ajouté, ce qui n'ajoute pas les nouvelles lignes.


The docs sont un peu confus, la méthode b64encode est censé ajouter une nouvelle ligne pour chaque caractère 60e, et l'exemple de la méthode encode64 utilise en fait la méthode b64encode.

Il semble que la méthode pack("m") pour la classe Array utilisée par encode64 ajoute également les nouvelles lignes. Je considère que c'est un bug de conception que ce n'est pas facultatif. Vous pouvez supprimer vous-même les nouvelles lignes ou, si vous utilisez des rails, ActiveSupport::CoreExtensions::Base64::Encoding avec la méthode encode64s.

+37

Il semble que depuis que j'ai écrit cette réponse, il y a maintenant 'strict_encode64()' qui n'ajoute apparemment pas de saut de ligne. –

+12

Tellement stupide! Pourquoi tu me fais ça, Ruby? –

+1

Cela me tue! Juste perdu une heure sans raison valable! –

9

Oui, c'est tout à fait normal. Le doc donne un exemple démontrant le découpage de ligne. base64 fait la même chose dans d'autres langues (par exemple Python). La raison pour laquelle les retours à la ligne sans contenu sont ajoutés à l'étape de codage est que base64 a été conçu à l'origine comme un mécanisme d'encodage pour l'envoi de contenu binaire dans un courrier électronique, où la longueur de ligne est limitée. N'hésitez pas à les remplacer si vous n'en avez pas besoin.

+1

Cela vient de se passer dans mon application Android (bibliothèque Base64 de Java). J'étais totalement confus avec cet étrange phénomène. Il m'a fallu littéralement 1 heure pour comprendre ce qui ne va pas et ensuite cherché l'erreur. Ce commentaire aide à comprendre les problèmes hérités même après 6 ans. –

99

Dans ruby-1.9.2 vous avez Base64.strict_encode64 qui n'ajoute pas ce \ n (retour à la ligne) à la fin.

+0

C'est une solution beaucoup plus facile! – Avishai

+0

Ceci devrait être la réponse acceptée – Darbio

+0

Merci pour la solution !!! – qcam

2

On dirait qu'ils ont à être dépouillé/ignoré, comme:

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

Cette solution est sale .. anythein else? –

+1

@yaauie ([via modification suggérée] (http://stackoverflow.com/review/suggested-edits/6210102)): Les modifications qui apportent une modification substantielle ne doivent généralement pas être effectuées. Je recommande d'afficher cela comme une réponse distincte. – Pokechu22

0

Utilisez strict_encode64. encode64 ajoute \ n tous les 60 symboles

Questions connexes