La bibliothèque Base64 intégrée dans Ruby ajoute quelques '\ n's. Je suis incapable de trouver la raison. Pour cet exemple spécial:
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 à la 6ème position à partir de la fin. Le décodeur (Base64.decode64) renvoie parfaitement l'ancienne chaîne. 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 est livrée sans les \ n.
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]
Réponses:
Edit: Depuis que j'ai écrit, cette réponse a
Base64.strict_encode64()
été ajoutée, ce qui n'ajoute pas de nouvelles lignes.Les documents sont quelque peu déroutants, la
b64encode
méthode est censée ajouter une nouvelle ligne pour chaque 60e caractère, et l'exemple de laencode64
méthode utilise en fait lab64encode
méthode.Il semble que la
pack("m")
méthode de la classe Array utilisée parencode64
ajoute également les nouvelles lignes. Je considérerais comme un bug de conception que ce n'est pas facultatif.Vous pouvez soit supprimer les nouvelles lignes vous-même, soit si vous utilisez des rails, il y a ActiveSupport :: CoreExtensions :: Base64 :: Encoding avec la
encode64s
méthode.la source
strict_encode64()
qui n'ajoute apparemment pas de nouvelles lignes.Dans ruby-1.9.2, vous avez Base64.strict_encode64 qui n'ajoute pas cela \ n (nouvelle ligne) à la fin.
la source
Ouais, c'est tout à fait normal. Le document donne un exemple illustrant le fractionnement de ligne. base64 fait la même chose dans d'autres langages (par exemple Python).
La raison pour laquelle des nouvelles lignes sans contenu sont ajoutées au stade de l'encodage est que la base64 a été initialement conçue comme un mécanisme de codage pour l'envoi de contenu binaire par courrier électronique, où la longueur de ligne est limitée. N'hésitez pas à les remplacer si vous n'en avez pas besoin.
la source
Il semble qu'ils doivent être supprimés / ignorés, comme:
la source
Utilisez la
strict_encode64
méthode.encode64
ajoute \ n tous les 60 symbolesla source
L'
\n
ajout lors de l'utilisationBase64#encode64
est correct, consultez cet article: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/la source