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,
b64encode
se supone que el método agrega una nueva línea por cada 60 caracteres, y el ejemplo para elencode64
método es realmente usar elb64encode
método.Parece que el
pack("m")
método para la clase Array utilizado porencode64
tambié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
encode64s
mé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_encode64
Método de usoencode64
agrega \ n cada 60 símbolosfuente
Lo
\n
agregado cuando se usaBase64#encode64
es correcto, consulte esta publicación: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/fuente