Extraño / n en cadena codificada en base64 en Ruby
encode (6)
La biblioteca Base64 incorporada en Ruby está agregando algunos ''/ n''. No puedo descubrir el motivo. 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''s están en la última y sexta posición desde el final. El decodificador (Base64.decode64) devuelve la cadena anterior perfectamente. Lo extraño es que estos / n no agregan ningún valor a la cadena codificada. Cuando elimino las nuevas líneas de la cadena de salida, el decodificador lo decodifica de nuevo perfectamente.
irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("/n", '''')) == str
=> true
Más de esto, utilicé otra biblioteca JS para producir la salida codificada en base64 de la misma cadena de entrada, la salida viene sin / n''s.
¿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]
El /n
agregado al usar Base64#encode64
es correcto, revisa esta publicación: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/
En ruby-1.9.2 tienes Base64.strict_encode64 que no agrega esa / n (nueva línea) al final.
Parece que tienen que ser despojados / ignorados, como:
Base64.encode64(str).gsub(//n/, '''')
Sí, esto es bastante normal. El doc proporciona un ejemplo que demuestra la división de línea. base64 hace lo mismo en otros idiomas también (por ejemplo, Python).
La razón por la que se agregan nuevas líneas libres de 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.
Use el método strict_encode64
. encode64
agrega / n cada 60 símbolos
Editar: Desde que escribí esta respuesta, se agregó Base64.strict_encode64()
, que no agrega nuevas líneas.
Los documentos son algo confusos, se supone que el método b64encode
agrega una nueva línea para cada 60º carácter, y el ejemplo para el método encode64
está usando el método b64encode
.
Parece que el método pack("m")
para la clase Array usado por encode64
también agrega las nuevas líneas. Lo consideraría un error de diseño que esto no es opcional.
Puede eliminar las nuevas líneas usted mismo, o si está utilizando raíles, hay ActiveSupport::CoreExtensions::Base64::Encoding con el método encode64s
.