180 votes

Étrange \n en chaîne encodée en base64 en Ruby

La bibliothèque Base64 intégrée à Ruby ajoute quelques ' \n 's. Je ne parviens pas à en trouver la raison. Pour cet exemple particulier :

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"

El \n sont en dernière et 6ème position à partir de la fin. Le décodeur (Base64.decode64) renvoie l'ancienne chaîne parfaitement. Ce qui est étrange, c'est que 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 la décode à nouveau parfaitement.

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

De plus, j'ai utilisé une autre bibliothèque JS pour produire la sortie encodée en base64 de la même chaîne d'entrée, la sortie ne contient pas les éléments suivants \n 's.

Est-ce un bug ou autre chose ? Quelqu'un a-t-il déjà été confronté à ce problème ?

FYI,

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

0 votes

Même problème bizarre ici

266voto

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


Les docs sont quelque peu confuses, les b64encode est censée ajouter une nouvelle ligne à chaque 60e caractère, et l'exemple de la méthode encode64 utilise en fait la méthode b64encode méthode.

Il semble que le pack("m") pour la classe Array utilisée par encode64 ajoute également les nouvelles lignes. Je considère comme un bogue de conception le fait que cela ne soit pas optionnel.

Vous pouvez soit supprimer les nouvelles lignes vous-même, ou si vous utilisez rails, il y a ActiveSupport::CoreExtensions::Base64::Encodage avec le encode64s méthode.

47 votes

Il semble que depuis que j'ai écrit cette réponse, il y a maintenant strict_encode64() qui, ostensiblement, n'ajoute pas de nouvelles lignes.

19 votes

Si bête ! Pourquoi tu me fais ça, Ruby ?

1 votes

C'est un défaut d'assinie, mais comme @ChristofferHammarström le mentionne, il y a un moyen d'obtenir un vrai encodage b64 maintenant.

118voto

ghtn Points 793

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

0 votes

C'est une solution beaucoup plus simple !

0 votes

J'ai vérifié que Base64.strict_encode64 ne code pas correctement la chaîne de trois caractères. comme Base64.strict_encode64('abc') -> YWJj . l'exemple ci-dessus n'est pas codé correctement.

0 votes

@CodeMaker Je pensais YWJj est correcte. Qu'est-ce qui ne va pas avec ça ?

9voto

bobince Points 270740

Oui, c'est tout à fait normal. Le site doc donne un exemple démontrant le découpage des lignes. base64 fait la même chose dans d'autres langages (par exemple Python).

La raison pour laquelle des retours à la ligne sans contenu sont ajoutés au stade du codage est que la base64 a été conçue à l'origine comme un mécanisme de codage pour l'envoi de contenu binaire par courrier électronique, où la longueur des lignes est limitée. N'hésitez pas à les remplacer si vous n'en avez pas besoin.

1 votes

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

8voto

Utilisez strict_encode64 méthode. encode64 ajoute \n tous les 60 symboles

6voto

meesern Points 150

Il semble qu'ils doivent être dépouillés/ignorés, comme :

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

0 votes

Cette solution est sale quelqu'un d'autre ?

1 votes

@yaauie ( via suggested edit ) : Les modifications qui apportent un changement substantiel ne devraient généralement pas être effectuées. Je recommanderais de poster ce point dans une réponse séparée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X