La biblioteca Base64 incorporada en Ruby está agregando algunos '\ n's. No puedo encontrar la razón. Para este ejemplo especial:
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"
Los \ n están en la última y sexta posición desde el final. El decodificador (Base64.decode64) devuelve la cadena antigua perfectamente. Lo extraño es que estos \ n no agregan ningún valor a la cadena codificada. Cuando elimino las líneas nuevas de la cadena de salida, el decodificador la decodifica nuevamente perfectamente.
irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str
=> true
Más de esto, usé otra biblioteca JS para producir la salida codificada en base64 de la misma cadena de entrada, la salida viene sin los \ n.
¿Es esto un error o algo más? ¿Alguien ha enfrentado este problema antes?
FYI
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]

Respuestas:
Editar: desde que escribí esta respuesta
Base64.strict_encode64()se agregó, que no agrega nuevas líneas.Los documentos son algo confusos,
b64encodese supone que el método agrega una nueva línea por cada 60 caracteres, y el ejemplo para elencode64método es realmente usar elb64encodemétodo.Parece que el
pack("m")método para la clase Array utilizado porencode64también agrega las nuevas líneas. Consideraría un error de diseño que esto no es opcional.Puede eliminar las nuevas líneas usted mismo, o si está utilizando rieles, hay ActiveSupport :: CoreExtensions :: Base64 :: Codificación con el
encode64smétodo.fuente
strict_encode64()que aparentemente no agrega nuevas líneas.En ruby-1.9.2 tiene Base64.strict_encode64 que no agrega ese \ n (nueva línea) al final.
fuente
Sí, esto es bastante normal. El documento da un ejemplo que demuestra la división de línea. base64 también hace lo mismo en otros idiomas (por ejemplo, Python).
La razón por la que se agregan nuevas líneas sin contenido en la etapa de codificación es porque base64 se diseñó originalmente como un mecanismo de codificación para enviar contenido binario en un correo electrónico, donde la longitud de la línea es limitada. Siéntase libre de reemplazarlos si no los necesita.
fuente
Parece que tienen que ser despojados / ignorados, como:
fuente
strict_encode64Método de usoencode64agrega \ n cada 60 símbolosfuente
Lo
\nagregado cuando se usaBase64#encode64es correcto, consulte esta publicación: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/fuente