La bibliothèque Base64 intégrée dans Ruby ajoute des '\ n's. Je ne parviens pas à en 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 6ème position 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 encodé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
De plus, j’ai utilisé une autre bibliothèque JS pour produire la sortie codée en base64 de la même chaîne d’entrée, la sortie est fournie sans les\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]
Edit: Depuis que j'ai écrit cette réponse Base64.strict_encode64()
a été ajouté, ce qui n'ajoute pas de saut de ligne.
Les docs sont un peu déroutants, la méthode b64encode
Est supposée ajouter une nouvelle ligne pour chaque 60ème caractère, et l'exemple de la méthode encode64
Utilise en fait le b64encode
Méthode.
Il semble que la méthode pack("m")
de la classe Array utilisée par encode64
Ajoute également les nouvelles lignes. Je considérerais comme un bogue de conception que ce n’est pas facultatif.
Vous pouvez soit supprimer les nouvelles lignes vous-même, soit utiliser Rails ActiveSupport :: CoreExtensions :: Base64 :: Encoding avec la méthode encode64s
.
Dans Ruby-1.9.2, vous avez Base64.strict_encode64 qui n’ajoute pas que\n (nouvelle ligne) à la fin.
Oui, c'est tout à fait normal. Le doc donne un exemple illustrant le fractionnement de lignes. base64 fait la même chose dans d’autres langages (p. ex. Python).
La raison pour laquelle les nouvelles lignes sans contenu sont ajoutées au stade de l’encodage tient au fait que base64 a été conçu à l’origine comme un mécanisme de codage pour l’envoi de contenu binaire dans un courrier électronique, où la longueur de la ligne est limitée. N'hésitez pas à les remplacer si vous n'en avez pas besoin.
On dirait qu'ils doivent être déshabillés/ignorés, comme:
Base64.encode64(str).gsub(/\n/, '')
Le \n
ajouté lors de l’utilisation de Base64#encode64
est correct, consultez ce message: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-Ruby/
Utilisation strict_encode64
méthode. encode64
ajoute\n tous les 60 symboles