Extraño en la cadena codificada base64 en Ruby


La biblioteca Base64 incorporada en Ruby está agregando algunos '\n's. No puedo averiguar 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's 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's no añaden 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, usé otra biblioteca JS para produce la salida codificada base64 de la misma cadena de entrada, la salida viene sin los \n.

¿Es esto un error o algo más? ¿Alguien se ha enfrentado a este problema antes?

PARA SU información,

$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Author: intellidiot, 2010-04-12

6 answers

Editar: Desde que escribí esta respuesta se agregó Base64.strict_encode64(), que no agrega nuevas líneas.


Los documentos son algo confusos, el método b64encode se supone que agrega una nueva línea por cada carácter 60, 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 utilizada por encode64 también agrega las nuevas líneas. Yo lo consideraría un error de diseño que esto no es opcional.

Puede eliminar las nuevas líneas usted mismo, o si está usando rails, está ActiveSupport::CoreExtensions::Base64::Encoding con el método encode64s.

 151
Author: Christoffer Hammarström,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-01 07:39:54

En ruby-1.9.2 tienes Base64.strict_encode64 que no añade que \n (nueva línea) al final.

 102
Author: ghtn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-13 12:32:41

Sí, esto es bastante normal. El documento da un ejemplo que demuestra la división de líneas. base64 hace lo mismo en otros idiomas también (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 fue originalmente ideado como un mecanismo de codificación para enviar contenido binario en el correo electrónico, donde la longitud de la línea es limitada. Siéntase libre de reemplazarlos si no los necesita.

 9
Author: bobince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-12 09:43:06

Parece que tienen que ser despojados / ignorados, como:

Base64.encode64(str).gsub(/\n/, '')
 2
Author: meesern,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-22 15:28:51

El \n añadido cuando se usa Base64#encode64 es correcto, echa un vistazo a este post: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby /

 2
Author: user1519240,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-12 18:59:04

Utilice el método strict_encode64. encode64 añade \n cada 60 símbolos

 0
Author: Александр Тихонович,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-01 13:19:09