web-dev-qa-db-fra.com

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

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]
140
intellidiot

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.

189

Dans Ruby-1.9.2, vous avez Base64.strict_encode64 qui n’ajoute pas que\n (nouvelle ligne) à la fin.

107
ghtn

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.

9
bobince

On dirait qu'ils doivent être déshabillés/ignorés, comme:

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

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/

2
user1519240

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